hduoj 1561 The more, The Better
来源:互联网 发布:java商城 编辑:程序博客网 时间:2024/05/17 05:07
The more, The Better
树形DP题目。树形DP+多重背包问题。由于初始化的原因,wrong了几次。方程很好写。我们先增加一个额外的节点0,同时将对应的攻克的城堡数目+1.方程如下:dp[r][j] = max(dp[r][j] , dp[r][j-k] + dp[u][k])其中u是r的儿子节点.
#include <iostream>#include <stdio.h>#include <string.h>#include <vector>using namespace std ;const int maxn = 205 ;vector<int> G[maxn] ;int dp[maxn][maxn] ;int w[maxn] ;int n ;int m ;void init(){ for(int i = 0 ; i < maxn ; i ++) G[i].clear() ; memset(dp , 0 , sizeof(dp)) ;}void dfs(int r){ dp[r][1] = w[r] ; for(int i = 0 ; i < G[r].size(); i ++) dfs(G[r][i]) ; for(int i = 0 ; i < G[r].size() ; i ++){ int u = G[r][i] ; for(int j = m ; j > 1 ; j --){ for(int k = 1 ; k < j ; k ++){ if(dp[r][j] < dp[r][j - k] + dp[u][k]){ dp[r][j] = dp[r][j - k] + dp[u][k] ; } } } }}int main(){// freopen("data.in" ,"r" , stdin) ;// freopen("tmp.txt" ,"w" , stdout) ; while(scanf("%d%d" , &n , &m) , n+m){ init() ; int a ; int b ; m ++ ; for(int i = 1 ; i <= n ; i ++){ scanf("%d%d" , &a , &b) ; G[a].push_back(i); w[i] = b ; } dfs(0) ; printf("%d\n" , dp[0][m]) ; } return 0 ;}
- hduoj 1561 The more, The Better
- The more, The Better
- The more, The Better
- The more, The Better
- hdoj(hdu)-1561-the more the better
- hdu 1561 The more,The better
- hdu 1561 the more,the better
- Hdu 1561 The more, The Better
- HDU 1561 The more, The Better
- HDU 1561 The more, The Better
- HDU-1561-The more, The Better
- HDU 1561 The more, The Better
- HDU 1561 The more, The Better
- HDU:1561 The more,The Better
- HDOJ 1561 The more, The Better
- HDU 1561 The more, The Better
- hdu 1561 The more, The Better
- HDU 1561 The more ,The Better
- Chapter09-“内核模式下的线程同步”之互斥量内核对象
- Android EditText获得焦点时边框颜色变深
- Qt 连接SQLITE数据库
- JS DOM 中的空白节点的过滤
- 高级 JavaScript 实例01
- hduoj 1561 The more, The Better
- 数据库--主键值、输出参数
- 画笔的用法以及其参数
- 编写一个求定积分的通用函数
- JSP中的EL表达式
- 高级 JavaScript 实例02
- S3C2440之UART操作(FIFO中断模式)
- linux shell 逻辑运算符、逻辑表达式test,[],[[]]详解
- STL std::list使用说明