結果
問題 | No.196 典型DP (1) |
ユーザー |
![]() |
提出日時 | 2017-11-16 21:32:58 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
TLE
|
実行時間 | - |
コード長 | 1,456 bytes |
コンパイル時間 | 1,592 ms |
コンパイル使用メモリ | 171,976 KB |
実行使用メモリ | 40,356 KB |
最終ジャッジ日時 | 2024-11-25 06:46:19 |
合計ジャッジ時間 | 25,066 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 35 TLE * 6 |
ソースコード
#include <bits/stdc++.h>#define rep(i, n) for (lli i = 0; i < (n); i++)#define rrep(i, n) for (lli i = (n)-1; i >= 0; i--)using namespace std;using lli = long long int;lli mod = 1e9 + 7;vector<int> e[2005];lli dp[2005][2005] = {};lli memo[2005] = {};int n, k;// iの部分木でj個色が塗られている場合の数int dfs(int cur, int par){if (cur != 0 and e[cur].size() == 1) {// leafdp[cur][1] = 1;dp[cur][0] = 1;memo[cur] = 1;return 1;}int size = 1;for (auto s : e[cur]) {if (s == par)continue;size += dfs(s, cur);}dp[cur][0] = 1;for (auto s : e[cur]) {if (s == par)continue;vector<lli> tmp(n + 1, 0);rep(i, k + 1){tmp[i] = dp[cur][i];}vector<lli> hoge(n + 1, 0);rep(i, memo[s] + 1){rep(j, k + 1){if (i + j > size)break;hoge[i + j] += (tmp[j] % mod * dp[s][i]) % mod;hoge[i + j] %= mod;}}rep(i, k + 1) dp[cur][i] = hoge[i];}dp[cur][size] = 1;memo[cur] = size;return size;}int main(){cin >> n >> k;int a, b;rep(i, n - 1){cin >> a >> b;e[a].push_back(b);e[b].push_back(a);}dfs(0, -1);cout << dp[0][k] << endl;}