【♂Not The Triumph♂O(∩_∩)O哈哈~But The Struggle♂】

竞赛决不是捷径,它只是另一种艰辛的生活方式。得到与失去,只有时间会去评判;成功与失败,只有历史能去仲裁。我不会永远成功,正如我不会永远失败一样

  C++博客 :: 首页 :: 联系 ::  :: 管理
  6 Posts :: 239 Stories :: 25 Comments :: 0 Trackbacks

常用链接

留言簿(7)

我参与的团队

搜索

  •  

积分与排名

  • 积分 - 108466
  • 排名 - 229

最新评论

阅读排行榜

评论排行榜

Description
【问题描述】
设一个n个节点的二叉树tree的中序遍历为(l,2,3,…,n),其中数字1,2,3,…,n为节点编号。每个节点都有一个分数(均为正整数),记第i个节点的分数为di,tree及它的每个子树都有一个加分,任一棵子树subtree(也包含tree本身)的加分计算方法如下:
subtree的左子树的加分× subtree的右子树的加分+subtree的根的分数
若某个子树为空,规定其加分为1,叶子的加分就是叶节点本身的分数。不考虑它的空子树。
试求一棵符合中序遍历为(1,2,3,…,n)且加分最高的二叉树tree。要求输出;
(1)tree的最高加分
(2)tree的前序遍历

Input
第1行:一个整数n(n<30),为节点个数。
第2行:n个用空格隔开的整数,为每个节点的分数(分数<100)。

Output
第1行:一个整数,为最高加分(结果不会超过4,000,000,000)。
第2行:n个用空格隔开的整数,为该树的前序遍历。

Sample Input
5
5 7 1 2 10

Sample Output
145
3 1 2 4 5

分析:
用树形DP可解(叶子-->树根类型).
F[i][j]表示以i为开始节点到j的末尾节点的最大加分数。
状态方程:F[i][j]=max(F[i][k-1]*F[k+1][j]+a[k]){k为i,j的根}
最后只需枚举一个开始节点,节点个数,末尾节点,根四个元素即可求出F[i][j]间的最大加分数。

【参考程序】:

#include<cstring>
#include
<cstdio>
#include
<iostream>
using namespace std;

int a[40],F[40][40],root[40][40];
int n;
void out(int l,int r)
{
    
if (r>=l)
    {
        printf(
"%d ",root[l][r]);
        
out(l,root[l][r]-1);
        
out(root[l][r]+1,r);
    }
}
int main()
{
    scanf(
"%d",&n);
    
for (int i=0;i<=n;i++)
        
for (int j=0;j<=n;j++)
            F[i][j]
=1;
    
for (int i=1;i<=n;i++)
    {
        scanf(
"%d",&a[i]);
        F[i][i]
=a[i]; root[i][i]=i;
    }
    
for (int len=2;len<=n;len++)/*枚举节点的个数*/
        
for (int i=1;i<=n-len+1;i++)
        {
            
int j=i+len-1;
            
for (int k=i;k<=j;k++)
            
/*以K为根i到k-1为左子树和k+1到j为右子树的最大加分*/
                
if (F[i][j]<F[i][k-1]*F[k+1][j]+a[k])
                {
                    F[i][j]
=F[i][k-1]*F[k+1][j]+a[k];
                    root[i][j]
=k;
                }
        }
    printf(
"%d\n",F[1][n]);
    
out(1,n);
    printf(
"\n");
    
return 0;
}


 

posted on 2009-08-23 21:14 开拓者 阅读(386) 评论(0)  编辑 收藏 引用 所属分类: NOIP历届题目树形DP

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理