1. 程式人生 > >洛谷 P1270 “訪問”美術館

洛谷 P1270 “訪問”美術館

思路:
非常樹上揹包的樹上揹包。

程式碼:

#include<bits/stdc++.h>
using namespace std;

#define maxn 100
#define maxm 600
#define read(x) scanf("%d",&x)

int m;

int a[maxn+5],t[maxn+5],cnt=0;
int lch[maxn+5],rch[maxn+5];
int f[maxn+5][maxm+5];

void dfs(int x) {
	if(x==0) {
		lch[x]=++cnt;
		read(t[lch[x]]),read(a[
lch[x]]); if(a[lch[x]]==0) dfs(lch[x]); } else if(a[x]==0) { lch[x]=++cnt; read(t[lch[x]]),read(a[lch[x]]); if(a[lch[x]]==0) { dfs(lch[x]); } rch[x]=++cnt; read(t[rch[x]]),read(a[rch[x]]); if(a[rch[x]]==0) { dfs(rch[x]); } } } int dp(int x,int y) { if(y<=0) return 0; if(~f[
x][y]) return f[x][y]; if(a[x]&&a[x]*5<=y) return f[x][y]=a[x]; if(a[x]) return f[x][y]=0; for(int i=0;i<=y;i++) { f[x][y]=max(f[x][y],dp(lch[x],i-2*t[lch[x]])+dp(rch[x],y-i-2*t[rch[x]])); } return f[x][y]; } int main() { memset(f,-1,sizeof(f)); read(m); m--; dfs(0); int ans=
dp(lch[0],m-2*t[lch[0]]); printf("%d",ans); return 0; }