首页 > 代码库 > codevs 访问艺术馆

codevs 访问艺术馆

/* codevs 1163 访问艺术馆 红果果的树形dp*/#include<iostream>#include<cstdio>#include<cstring>#define maxn 210using 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;}

 

codevs 访问艺术馆