博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj 1155
阅读量:6006 次
发布时间:2019-06-20

本文共 1401 字,大约阅读时间需要 4 分钟。

树形dp 结合01背包

View Code
1 #include
2 #include
3 #define max(a,b) a>b?a:b 4 const int INF = 1000000000; 5 const int maxn = 3010; 6 int head[maxn],dp[maxn][maxn],n,m; 7 int num[maxn]; 8 struct EDGE{
9 int v,w,next; 10 }edge[maxn]; 11 int tot; 12 void add_edge(int s,int t,int w){
13 edge[tot].v=t; 14 edge[tot].w=w; 15 edge[tot].next=head[s]; 16 head[s]=tot++; 17 } 18 void dfs(int u){
19 int i,j,k,tmp[maxn]; 20 for(i=head[u];i!=-1;i=edge[i].next){
21 int v=edge[i].v; 22 dfs(v); 23 for(j=0;j<=num[u];j++) 24 tmp[j]=dp[u][j]; 25 for(j = 0; j <= num[u]; j ++) 26 for(k = 1; k <= num[v]; k ++) 27 dp[u][j+k] = max(dp[u][j+k], tmp[j]+dp[v][k]-edge[i].w); 28 num[u] += num[v];//利用回溯,自底向上的进行DP 29 } 30 } 31 int main(){
32 int i,j,k,a,c; 33 tot=0; 34 memset(head,-1,sizeof(head)); 35 scanf("%d%d",&n,&m); 36 for(i=1;i<=n;i++) 37 for(j=1;j<=n;j++) 38 dp[i][j]=-INF; 39 for(i=1;i<=n-m;i++){
40 scanf("%d",&k); 41 for(j=0;j
=0;i--){
53 if(dp[1][i]>=0){
54 printf("%d\n",i); 55 break; 56 } 57 } 58 return 0; 59 }

转载于:https://www.cnblogs.com/xuschang-93/archive/2012/03/17/2403053.html

你可能感兴趣的文章
Nginx配置文件nginx.conf详解
查看>>
Ubuntu下实现socks代理转http代理
查看>>
使用PL/SQL能查询oracle中数据,在for update 语句中一直卡住
查看>>
05机器学习实战之Logistic 回归scikit-learn实现
查看>>
libevent evbuffer参考文章
查看>>
用python爬取app照片
查看>>
ASP.NET状态管理
查看>>
三生万物:决策树
查看>>
Javascript计算器(Calculator) 利用Javascript计算形如“(8*(2*(2+3)*2)*10)*10 ”表达式的值...
查看>>
java学习(二)对象与类
查看>>
win10去除快捷方式小箭头
查看>>
KendoUI和wijmoUI 它们的Grid比较 20120423
查看>>
Centos服务器被挂马的一次抓马经历
查看>>
mysql数据库innobackupex热备
查看>>
Spring MVC 架构的java web工程如何添加登录过滤器
查看>>
返回一个整数数组中最大子数组的值(程序能处理1000个元素)
查看>>
[Android]如何判断屏幕是圆形的(手表设备)
查看>>
Dubbo Admin管理控制台
查看>>
单例模式
查看>>
SQL资料
查看>>