Vijos 1100 加分二叉树(树形DP)

题目链接

感觉和区间DP很类似,觉得还挺简单的,难得1Y,以前的时候直接没思路。。。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <queue>
 4 #include <string>
 5 using namespace std;
 6 #define LL long long
 7 int p[101];
 8 int o[101];
 9 LL dp[101][101];
10 int num = 1;
11 LL dfs(int L,int R)
12 {
13     int i;
14     LL temp;
15     LL maxz = -1000000;
16     if(dp[L][R])
17     return dp[L][R];
18     if(L > R)
19     return 1;
20     if(L == R)
21     return p[L];
22     for(i = L;i <= R;i ++)
23     {
24         if(maxz < (temp = dfs(L,i-1)*dfs(i+1,R)+p[i]))
25         {
26             maxz = temp;
27         }
28     }
29     dp[L][R] = maxz;
30     return dp[L][R];
31 }
32 void find(int L,int R)
33 {
34     int i,key;
35     if(L == R)
36     {
37         o[num++] = L;
38         return ;
39     }
40     else if(L > R)
41     return ;
42     for(i = L;i <= R;i ++)
43     {
44         if(dp[L][R] ==  dfs(L,i-1)*dfs(i+1,R)+p[i])
45         {
46             key = i;
47             break;
48         }
49     }
50     o[num++] = key;
51     find(L,key-1);
52     find(key+1,R);
53 }
54 int main()
55 {
56     int i,n;
57     scanf("%d",&n);
58     for(i = 1;i <= n;i ++)
59     scanf("%d",&p[i]);
60     printf("%lld\n",dfs(1,n));
61     find(1,n);
62     for(i = 1;i <= n;i ++)
63     {
64         if(i == 1)
65         printf("%d",o[i]);
66         else
67         printf(" %d",o[i]);
68     }
69     printf("\n");
70     return 0;
71 }

 

转载于:https://www.cnblogs.com/naix-x/archive/2013/03/10/2952943.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值