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;}

原创粉丝点击