hdu1011Starship Troopers【树型dp】
来源:互联网 发布:淘宝箱包客服话术大全 编辑:程序博客网 时间:2024/05/22 05:13
这轮刷的树型dp最后一题~~和前两个题差不多,尤其是和poj1947Rebuilding Roads十分的相似 ,都怪自己又读错题了orz,题意是说可以找分支中的一部分,而我傻乎乎的以为只能找一条没有分叉的线,即使是下午毛概想明白了,但依旧不知道自己为啥一直数组越界,回溯的结构和上一个题一模一样,这个题是留下当前节点需要的,剩余的给子节点
#include <iostream>#include <vector>#include <cstring>#include <cstdio>using namespace std;const int Ni = 110;int n,m;int cos[Ni],weg[Ni];int dp[Ni][Ni];bool vis[Ni];vector<int> dv[Ni];inline int max(int a,int b){return a>b? a:b;}void dfs(int p){ int i,j,k; int temp=(cos[p]+19)/20; for(i=temp;i<=m;i++) dp[p][i]=weg[p]; vis[p]=1; for(i=0;i<dv[p].size();i++) { int t=dv[p][i]; if(vis[t]) continue; dfs(t); for(j=m;j>=temp;j--) { for(k=1; k<=j-temp; k++)//留下temp攻打p dp[p][j]=max(dp[p][j],dp[p][j-k]+dp[t][k]); } }}int main(){ int i; while(scanf("%d%d",&n,&m),n!=-1||m!=-1) { for(i=0; i<=n; i++) dv[i].clear(); memset(dp,0,sizeof(dp)); memset(vis,0,sizeof(vis)); for(i=1; i<=n; i++) scanf("%d%d",cos+i,weg+i); for(i=1; i<n; i++) { int u,v; scanf("%d%d",&u,&v); dv[u].push_back(v); dv[v].push_back(u); } if(m==0) {printf("0\n");continue;} dfs(1); printf("%d\n",dp[1][m]); } return 0;}
附上不知道为啥越界的代码:
/*******hdu10112015.12.29re*******/#include <iostream>#include<cstdio>#include<cstring>#include<vector>using namespace std;int val[120],vol[120];int n,m,tol,dp[120][120];bool vis[120];vector<int>num[120];int max(int a,int b){ if(a>b) return a; return b;}void dfs(int p){ vis[p]=1; int tmp=(val[p]+19)/20; // if(tmp==0) tmp++; if(tmp>=120) return; for(int i=tmp;i<=m;i++) dp[p][i]=vol[p]; for(int i=0;i<num[p].size();i++) { int t=num[p][i]; if(vis[t]) continue; dfs(t); for(int j=m;j>=tmp;j--) { for(int k=1; k<=j-tmp; k++)//ÁôÏÂtemp¹¥´òp dp[p][j]=max(dp[p][j],dp[p][j-k]+dp[t][k]); } }}int main(){ // freopen("cin.txt","r",stdin); while(~scanf("%d%d",&n,&m)) { if(m==-1&&n==-1) break; for(int i=1;i<=n;i++) { scanf("%d%d",&val[i],&vol[i]); num[i].clear(); } if(m==0) { printf("0\n"); continue; } memset(dp,0,sizeof(dp)); memset(vis,0,sizeof(vis)); for(int i=1;i<n;i++) { int a,b; scanf("%d%d",&a,&b); num[a].push_back(b); num[b].push_back(a); } dfs(1); printf("%d\n",dp[1][m]); } return 0;}
明天就要校赛了,状态一点都不好T^T
0 0
- hdu1011Starship Troopers【树型dp】
- hdu1011Starship Troopers 树形DP
- hdu1011Starship Troopers (树形DP)
- hdu1011Starship Troopers(树形dp)
- HDU1011Starship Troopers(DP+DFS)深度优先搜索+动态规划
- hdu1011Starship Troopers(树形背包)
- Starship Troopers--树形dp
- hdu_1011_Starship Troopers(树形DP)
- HDU1011:Starship Troopers(树形DP)
- hdu 1011 Starship Troopers DP
- HDU1011 Starship Troopers(树形dp)
- 【树形dp】HDU1011-Starship Troopers
- Starship Troopers (树形dp+背包)
- 【DP】HDU 1011 Starship Troopers 树形DP
- 解题报告:HDU1011 Starship Troopers 树型DP(树上01背包)
- HDU 1011 Starship Troopers 树状DP
- 树状DP- hdu 1011 Starship Troopers
- ZOJ2111 HDU1011 Starship Troopers, 树形DP
- View更新绘制过程
- 运输层—滑动窗口协议
- c++已入门,想动手练练项目,不知道如何下手
- Java获取当前操作系统的信息
- timer与信号量
- hdu1011Starship Troopers【树型dp】
- 获取桌面应用、动态壁纸、输入法应用
- 接口和抽象类的区别
- 手机壳释放致癌物质“苯”吗?专家:确实会
- java中的list与iterator的删除关系
- 实例3:显示在标题上的进度条
- ios 并行开发
- samba常见问题
- 数据库总结2