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幅画所需要的时间

浙公网安备 33010602011771号