题目:
状态表示:
dp[i][j]:以i为根的子树用j秒能偷到的最大画数
数据范围:
一个展室最多有 20幅画。通过每个走廊的时间不超过20秒。艺术馆最多有100 个展室。警察赶到的时间在6000 秒以内。
#include<bits/stdc++.h>
using namespace std;
const int WAY=1e5+10,T=6010;
int f[WAY][T],l[WAY],r[WAY];
int t,tatol;//tatol走廊总数
void dfs(int now){//now当前走廊标识
int len,p;
cin>>len>>p;
if(p==0){//now走廊尽头没有画
l[now]=++total;dfs(l[now]);
r[now]=++total;dfs(r[now]);
for(int i=len*2+1;i<=t;i++)//走完当前走廊时间-最后时间
for(int j=0;j<=i-len*2;j++)//j:分给左儿子的时间,i-len*2-j:分给右儿子时间
{
f[now][i]=max(f[l[now][j],f[r[now][i-len*2-j]);
}
}else{//当前走廊为叶子节点
for(int i=len*2+5;i<=min(len*2+p*5,t);i++)f[now][i]=(i-len*2)/5;
for(int i=len*2+p*5+1;i<=t;i++)f[now][i]=f[now][i-1];//剩余时间补齐
}
}
int main(){
cin>>t;
dfs(0);
cout<<f[0][t-1];
}