http://codeforces.com/contest/161/problem/D
树形dp,很优美,利用了树的性质和dfs回溯...
注意以防重复,所以要把计数提前到更新操作前
#define N 50005
LL dp[N][505];
vector<int> v[N];
LL ans = 0;
int n,k;
void dfs(int u,int fa){
int i;
dp[u][0] = 1;
for(i=0;i<v[u].size();i++){
if(v[u][i]!=fa){
dfs(v[u][i],u);
int j;
for(j=1;j<=k;j++){//计数提前
ans += dp[u][j-1]*dp[v[u][i]][k-j];
}
for(j=1;j<=k;j++){
dp[u][j] += dp[v[u][i]][j-1];
}
}
}
}
int main(){FRE;
cin>>n>>k;
int i;
for(i=1;i<n;i++){
int x,y;
cin>>x>>y;
v[x].push_back(y);
v[y].push_back(x);
}
dfs(1,1);
cout<<ans<<endl;
return 0;
}

本文介绍了一种使用树形dp解决特定树形问题的方法,通过递归地应用动态规划,作者展示了如何利用树的性质和深度优先搜索来解决复杂问题。重点在于提前计数以避免重复操作,并通过实例演示了算法的实现过程。
7015

被折叠的 条评论
为什么被折叠?



