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
",f[1][s]);
	return 0;
}

  第二种dp[i][j]表示到i节点偷了j幅画所需要的时间

  

原文地址:https://www.cnblogs.com/codetogether/p/13329987.html