hdu1561The more, The Better(树形dp入门)
src:http://acm.hdu.edu.cn/showproblem.php?pid=1561
ac代码:
#include <iostream> #include<cstdlib> #include<algorithm> #include<cmath> #include<functional> #include<utility> #include<string> #include<string.h> #include<vector> #include<iomanip> #include<stack> using namespace std; #define FOR(i,a,b) for(int i=a;i<=b;i++) const int inf=99999999; int n,m,val[205],dp[205][205]; vector<int>head[205]; void add_edge(int u,int v) { head[u].push_back(v); } int dfs(int u,int M) { dp[u][1]=val[u]; int t=1,tt; //tt表示子树有几种状态 for(int i=0;i<head[u].size();i++){ int v=head[u][i]; tt=dfs(v,M-1); t+=tt; for(int j=M;j>=2;j--){ for(int k=1;k<=tt&&k<j;k++){ dp[u][j]=max(dp[u][j],dp[u][j-k]+dp[v][k]); } } } return t; } int main() { std::ios::sync_with_stdio(false); int fa; while(cin>>n>>m&&n&&m){ FOR(i,0,n)head[i].clear(); val[0]=0; memset(dp,0,sizeof(dp)); for(int i=1;i<=n;i++){ cin>>fa>>val[i]; add_edge(fa,i); } dfs(0,m+1); cout<<dp[0][m+1]<<endl; } return 0; }

浙公网安备 33010602011771号