P1270 “访问”美术馆
两种dp方式 第一种dp[i][j]表示到第i个节点花费j的时间能偷到的最多的画
#include <cstdio> #include <algorithm> using namespace std; int s,a[210],d[210],f[210][6010]; void make_tree(int root){ int x,y; scanf("%d%d",&x,&y); d[root]=2*x; a[root]=y; if(y==0){ make_tree(root*2); make_tree(root*2+1); } } void dfs(int root){ if(a[root]){ for(int i=0;i/5<=a[root] && d[root]+i<=s;i++)f[root][d[root]+i]=i/5; return; } dfs(root*2); dfs(root*2+1); for(int i=d[root];i<=s;i++){ for(int j=0;j+d[root]<=i;j++)f[root][i]=max(f[root][i],f[root*2][j]+f[root*2+1][i-d[root]-j]); } } int main(){ scanf("%d",&s); s--; make_tree(1); dfs(1); printf("%d\n",f[1][s]); return 0; }
第二种dp[i][j]表示到i节点偷了j幅画所需要的时间