結果
| 問題 |
No.196 典型DP (1)
|
| コンテスト | |
| ユーザー |
nsd_fb
|
| 提出日時 | 2015-04-27 00:42:21 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 23 ms / 2,000 ms |
| コード長 | 1,766 bytes |
| コンパイル時間 | 1,481 ms |
| コンパイル使用メモリ | 169,828 KB |
| 実行使用メモリ | 6,944 KB |
| 最終ジャッジ日時 | 2024-07-05 03:21:23 |
| 合計ジャッジ時間 | 2,764 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 41 |
ソースコード
#include <bits/stdc++.h>
#ifdef LOCAL
#include "dump.hpp"
#else
#define dump(...)
#endif
using namespace std;
#define REP(i, a, b) for(int i = (a); i < int(b); ++i)
#define rep(i, n) REP(i, 0, n)
#define ALL(x) begin(x), end(x)
template<class T> inline void chmax(T &a, const T &b) { if(a < b) a = b; }
template<class T> inline void chmin(T &a, const T &b) { if(a > b) a = b; }
typedef vector<vector<int>> graph;
constexpr int mod = 1000000007;
constexpr int MAX = 2000;
int n, k;
vector<int> G[MAX];
pair<int, vector<int>> dfs(int v, int p) {
int size = 1;
vector<vector<int>> dp;
dp.reserve(G[v].size());
for(const auto &c : G[v]) {
if(c == p) continue;
const auto result = dfs(c, v);
size += result.first;
dp.emplace_back(move(result.second));
}
if(dp.empty()) return make_pair(1, vector<int>{1, 1});
int max_idx = -1;
int max_size = 0;
for(int i = 0; i < dp.size(); ++i) {
if(max_size < dp[i].size()) {
max_idx = i;
max_size = dp[i].size();
}
}
vector<int> res = move(dp[max_idx]);
const int m = min(size, k);
res.resize(m + 1, 0);
for(int i = 0; i < dp.size(); ++i) {
if(i == max_idx) continue;
vector<int> tmp(m + 1, 0);
for(int j = m; j >= 0; --j) {
for(int l = dp[i].size() - 1; l >= 0; --l) {
if(j + l > m) continue;
tmp[j + l] = (tmp[j + l] + static_cast<long long>(res[j]) * dp[i][l]) % mod;
}
}
res = move(tmp);
}
if(size <= k) res[size] += 1;
dump(v, size, res);
return make_pair(size, res);
}
int main() {
cin.tie(nullptr);
ios::sync_with_stdio(false);
cin >> n >> k;
for(int i = 0; i < n - 1; ++i) {
int a, b;
cin >> a >> b;
G[a].emplace_back(b);
G[b].emplace_back(a);
}
const auto ans = dfs(0, -1);
cout << ans.second[k] << endl;
return EXIT_SUCCESS;
}
nsd_fb