POJ 1155 TELE (树形DP+背包)
2015-07-19 10:17
405 查看
思路:设dp[i][j]为在以i为根节点的子树中,连接j个用户的最大收益。
u为父节点,v为子节点,那么dp[u][j] = max(dp[u][j],dp[u][j-k]+dp[v][k]+cost)。
实现过程注意加上break,不然容易T。。。
代码:
u为父节点,v为子节点,那么dp[u][j] = max(dp[u][j],dp[u][j-k]+dp[v][k]+cost)。
实现过程注意加上break,不然容易T。。。
代码:
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> using namespace std; const int maxn = 3005; const int inf = 0x3f3f3f3f; struct Nod{ int b,val,next; void init(int b,int val,int next){ this->b = b; this->val = val; this->next = next; } }buf[maxn<<1]; int len,E[maxn]; int n,m,dp[maxn][maxn]; void init(){ int i,j; memset(E,-1,sizeof(E)); len = 0; for(i=1;i<=n;i++)for(j=1;j<=n;j++)dp[i][j]=-inf; } void add_edge(int a,int b,int val){ buf[len].init(b,val,E[a]);E[a]=len++; buf[len].init(a,val,E[b]);E[b]=len++; } void dfs(int u,int pre){ int i,j,k,v,val; for(i=E[u];i!=-1;i=buf[i].next){ v=buf[i].b;val=buf[i].val; if(v == pre) continue; dfs(v,u); for(j=m;j>=0;j--){ if(dp[u][j] < -100000) continue; for(k=1;k<=m;k++){ if(dp[v][k] < -100000) break; dp[u][j+k]=max(dp[u][j+k],dp[u][j]+dp[v][k]+val); } } } } int main(){ scanf("%d%d",&n,&m); init(); int i,j,k,a,c; for(i=1;i<=n-m;i++){ scanf("%d",&k); while(k--){ scanf("%d%d",&a,&c); add_edge(i,a,-c); } } for(;i<=n;i++) scanf("%d",&dp[i][1]); dfs(1,-1); for(i=m;i>=0;i--) if(dp[1][i]>=0) break; printf("%d\n",i); return 0; }
相关文章推荐
- 日经社説 20150719 途上国の開発に効率の視点を
- Linux svnserver存储路径和文件的详细解释
- RHEL6.4上安装mysql5.6.24并配置
- [转]Spring 各种Advice示例
- 程序员面试资源搜集
- POJ 2112 Optimal Milking(最大流)
- 日经春秋 20150719
- 建造者模式
- Ogre参考手册(四)3.1.4-3.1.14 声明顶点、几何、片段程序(Ogre着色器脚本)
- java console ( mac osx ) 命令行编码
- os模块
- hdu5032 Always Cook Mushroom
- nodejs+php用socket(TCP)互通
- 汤姆猫程序(UIImageView动画)
- 关于VNC的控制原理以及安装使用方法
- Python 实现 淘宝秒杀 聚划算 自己主动提醒 源代码
- Android之——AsyncTask和Handler对比
- 天声人語 20150719
- 黄聪:如何使用CodeSmith批量生成代码(原创系列教程)
- BestCoder#48 1001 && 1002