codevs 访问艺术馆

Posted 一入OI深似海

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了codevs 访问艺术馆相关的知识,希望对你有一定的参考价值。

/* 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;
}

 

以上是关于codevs 访问艺术馆的主要内容,如果未能解决你的问题,请参考以下文章

访问艺术馆 (Codevs No.1163)

codevs1163 访问艺术馆

[codevs1163]访问艺术馆

访问艺术馆(codevs 1163)树形DP

树上动规codevs 1163访问艺术馆

“破锣摇滚”乐队(codevs 1444)