您的位置:首页 > 其它

codevs 访问艺术馆

2016-10-19 16:11 204 查看
/* codevs 1163 访问艺术馆 红果果的树形dp*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 210
using namespace std;
int n,m,lc[maxn],rc[maxn],g[maxn][2],T,v[maxn],f[maxn][maxn*6],x,y;
struct node{
int v,t,pre;
}e[maxn*2];
void dfs(int now,int val){
if(val){
v[now]=val;return;
}
scanf("%d%d",&x,&y);
lc[now]=++n;g[now][0]=x;dfs(n,y);
scanf("%d%d",&x,&y);
rc[now]=++n;g[now][1]=x;dfs(n,y);
}
void Dfs(int x){
if(lc[x]==0&&rc[x]==0){
for(int i=1;i<=T;i++)
f[x][i]=min(i/5,v[x]);
return;
}
Dfs(lc[x]);Dfs(rc[x]);
for(int i=0;i<=T;i++)
for(int j=0;j<=i;j++){
int s=0;
if(j>=2*g[x][0])s+=f[lc[x]][j-2*g[x][0]];
if(i-j>=2*g[x][1])s+=f[rc[x]][i-j-2*g[x][1]];
f[x][i]=max(f[x][i],s);
}
}
int main()
{
scanf("%d",&T);/*T-- 尼玛理解错了*/
scanf("%d%d",&x,&y);
T-=x*2;if(!y)dfs(++n,0);
Dfs(1);
printf("%d\n",f[1][T]);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: