hdu1561 树形DP
来源:互联网 发布:刚度矩阵 编辑:程序博客网 时间:2024/06/07 01:55
Description
Input
Output
Sample Input
3 20 10 20 37 42 20 10 42 17 17 62 20 0
Sample Output
513
0-1背包裸代码:
for i=1..N
for v=V..0
f[v]=max{f[v],f[v-c[i]]+w[i]};
状态转移方程:f[root][k]=max(f[root][k],f[root][k-j]+dp[u][j]);
m是个数,j是存几个,f[i][j]表示的是以i为根攻克j个城堡(且这j个城堡必须是它子树上的,不包括它本身),dp[i][j]表示的是是以i为根攻克j个城堡(且这j个城堡必须是它子树上的,一定它本身,ans[i]表示每个城堡的宝物,所以一定有dp[i][1]=ans[i];)。
for(int k=m;k>=0;k--)
for(int j=0;j<=k;j++)
f[root][k]=max(f[root][k],f[root][k-j]+dp[u][j]);
更新f[root][0~m]数组,然后全部更新完之后更新dp[root][0~m]。
如图所示样例2,先从root即0点访问3,3没有孩子,执行更新dp操作,因为所以叶子都满足dp[i][0~m]=ans[i],所以dp[3][0~m]都等于ans[3],以下同理。
返回到root,更新f[0][m~0]。
访问root-->2-->7-->6,访问到叶子,更新dp[6][0~m]。返回7,更新f[7][m~0],
从7-->5,更新叶子节点dp[5][0~m],
从5-->7,再次更新f[7][m~0],
从7-->2,更新dp[7][0~m],返回2节点,更新f[2][m~0],
从2-->4,更新叶子节点dp[4][0~m],
从4-->2,更新f[2][m~0],
从2-->1,更新dp[1][0~m],
从1-->2,更新f[2][m~0],
从2-->root,更新dp[2][0~m],
更新f[0][m~0],更新dp[0][0~m]。
代码:
#include <iostream>
#include <string.h>
using namespace std;
#define N 205
int n,m,edgeNum=0;
int ans[N],dp[N][N],f[N][N];
int visit[N],head[N];
struct Line
{
int v,next;
}edge[N];
void add(int u,int v)
{
edge[edgeNum].v=v;
edge[edgeNum].next=head[u];
head[u]=edgeNum++;
}
void dfs(int root)
{
visit[root]=1;
for(int i=head[root];i!=-1;i=edge[i].next)
{
int u=edge[i].v;
if(!visit[u])
{
dfs(u);
for(int k=m;k>=0;k--)
for(int j=0;j<=k;j++)
f[root][k]=max(f[root][k],f[root][k-j]+dp[u][j]);
}
}
for(int i=1;i<=m+1;i++)
dp[root][i]=f[root][i-1]+ans[root];
}
int main()
{
int a,b;
while(cin>>n>>m)
{
if(n==m&&n==0)
break;
edgeNum=ans[0]=0;
memset(f,0,sizeof(f));
memset(dp,0,sizeof(dp));
memset(head,-1,sizeof(head));
memset(visit,0,sizeof(visit));
for(int i=1;i<=n;i++)
{
cin>>a>>b;
ans[i]=b;
add(a,i);
}
dfs(0);
cout<<dp[0][m+1]<<endl;
/*for(int i=0;i<=m+1;i++)
{for(int j=0;j<=m+1;j++)
cout<<dp[i][j]<<' ';
cout<<endl;}*/
}
return 0;
}
- hdu1561 树形DP+背包
- hdu1561树形DP入门
- hdu1561 树形dp 背包
- hdu1561之树形dp
- hdu1561,树形dp+背包
- hdu1561树形dp
- hdu1561 树形dp
- hdu1561(树形dp)
- hdu1561(树形dp)
- 树形dp-hdu1561
- hdu1561 树形DP
- HDU1561【树形DP】
- hdu1561 树形dp
- HDU1561 树形DFS+DP
- hdu1561树形dp 01背包
- hdu1561(树形DP+背包问题)
- hdu1561树形dp+依赖背包
- HDU1561 树形dp,泛化背包
- 练习3.1
- 重拾python 二十一
- sql建表语句(含:序列、主键)
- Spring MVC 拦截器---27
- 单一职责原则例子
- hdu1561 树形DP
- 面试资料
- 【设计模式】依赖反转原则
- 隐藏DOM元素方法
- iOS 开发 网络编程详解之基本概念
- java基础巩固----路径问题
- 栈和队列(8)-- 最大值减去最小值小于或者等于num的子数组
- 遇到的问题以及解决方法(长按操作)
- 数据库连接中使用PreparedStatement预编译防止SQL注入