P1270 “访问”美术馆——不太一样的树形DP
P1270 “访问”美术馆
dfs读入,存图有点像线段树;
在枚举时间时,要减去走这条边的代价;
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn=1010; struct node { int tim,pic; }t[maxn]; int s; void read(int x) { scanf("%d%d",&t[x].tim,&t[x].pic); t[x].tim*=2; if(!t[x].pic) { read(x<<1); read((x<<1)+1); } } int dp[maxn][maxn]; void dfs(int x,int ti) { if(dp[x][ti]||!ti) return ; if(t[x].pic) { dp[x][ti]=min(t[x].pic,(ti-t[x].tim)/5); return ; } for(int i=0;i<=ti-t[x].tim;i++) { dfs(x<<1,i); dfs((x<<1)+1,ti-i-t[x].tim); dp[x][ti]=max(dp[x][ti],dp[x<<1][i]+dp[(x<<1)+1][ti-i-t[x].tim]); } } int main() { scanf("%d",&s); s--; read(1); dfs(1,s); printf("%d",dp[1][s]); return 0; }