-
I - The more, The Better
- HDU - 1561
- 题意:现有N座城堡,每座城堡有bi的宝藏,现在最多攻破M座城堡,且攻城要按顺序,要共攻破第i座城必须先攻破第j座城
- 思路:把题意转划一下,容易建边,val[0]=0,然后M++,这样就可以看做每一个点都有一个父亲节点需要攻破,一颗以0
- 为根的树,接下来就是 树形DP+背包过程了,先递归到叶子节点,在回溯不断更新背包最值。
-
#include<bits/stdc++.h> using namespace std; #define maxn 222 vector<int>mmp[maxn]; int n,m,a,b,val[maxn]; int dp[maxn][maxn]; void dfs(int root,int pre) { for(int i=1; i<=m; i++) dp[root][i]=val[root]; int len=mmp[root].size(); for(int i=0; i<len; i++) { int v=mmp[root][i]; if(v==root)continue; dfs(v,root); for(int j=m; j>1; j--) for(int k=0; k<j; k++) dp[root][j]=max(dp[root][j],dp[v][k]+dp[root][j-k]); } } int main() { while(~scanf("%d%d",&n,&m)) { val[0]=0; if(n==0&&m==0)break; m++; for(int i=1; i<=n; i++) { scanf("%d%d",&a,&val[i]); if(a==0)mmp[0].push_back(i); else mmp[a].push_back(i); } dfs(0,-1); printf("%d\n",dp[0][m]); for(int i=0; i<=n; i++) mmp[i].clear(); } return 0; }
I - The more, The Better HDU-树形DP+背包
最新推荐文章于 2019-10-22 20:48:50 发布