1163 访问艺术馆
来源:互联网 发布:spider python 下载 编辑:程序博客网 时间:2024/05/16 02:13
#include<iostream>#include<stack>#include<cstring>using namespace std;#define num 700int tree[num];int dp[num][num];//dp[i][j]表示i节点在j时间能取得的最多的画为多少void search(int root,int maxtime)//maxtime表示可能分配给root节点的最多时间{ if(tree[root*2+1]==-1)//叶子了 { int val = tree[root]*2; for(int i =1;i<=tree[root*2];i++) { dp[root][val+i*5]=i; } for(int i =1;i<=maxtime;i++) if(dp[root][i]==0&&dp[root][i-1]) dp[root][i]=dp[root][i-1]; return; } int val = tree[root]*2; search(root*2,maxtime-val); search(root*2+1,maxtime-val); for(int i =1;i<=maxtime;i++) for(int p =0;p<=i;p++) { int t1 = dp[root*2][p]; int t2 = dp[root*2+1][i-p]; if(t1+t2>dp[root][i+val])dp[root][i+val] =t1+t2; }}int main(){ int time; cin>>time; int index = 1; stack<int>s; s.push(index); memset(dp,0,sizeof(dp)); while(s.size())//用先序遍历进行插入,先根节点,后左子树,再右子树,用栈建树 { index = s.top(); s.pop(); int a,b; cin>>a>>b; tree[index]=a; if(b==0) { s.push(index*2+1); s.push(index*2); } else { tree[index*2]=b; tree[index*2+1]=-1; } } search(1,time); cout<<dp[1][time]<<endl; return 0;}