• luogu P1040 加分二叉树


    题目描述

    设一个n个节点的二叉树tree的中序遍历为(1,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的前序遍历

    输入输出格式

    输入格式:
    第1行:一个整数n(n<30),为节点个数。

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

    输出格式:
    第1行:一个整数,为最高加分(结果不会超过4,000,000,000)。

    第2行:n个用空格隔开的整数,为该树的前序遍历。

    输入输出样例

    输入样例#1:

    5
    5 7 1 2 10
    

    输出样例#1: 复制

    145
    3 1 2 4 5
    

    dp[i][j]表示区间i到j所能产生的最大贡献

    #include<cstdio>
    #include<iostream>
    using namespace std;
    const int maxn  =  106;
    int midtree[maxn];
    int n;
    int dp[maxn][maxn];
    inline int read() {
    	int x = 0,f = 1;char c = getchar();
    	while(c < '0' || c > '9') {
    		if(c == '-')f = -1;
    		c = getchar();
    	}
    	while(c <= '9' && c>= '0') x = x*10+c-'0',c = getchar();
    	return x*f;
    }
    int root[42][42];
    void print(int l,int r) {
    	if(l>r)return;
    	if(l==r){
    		printf("%d ",l);
    		return ;
    	}
    	printf("%d ",root[l][r]);
    	int mid=root[l][r];
    	print(l,mid-1);
    	print(mid+1,r);
    }
    int main() {
    	n=read();
    	for(int i=1;i<=n;++i) 
    		midtree[i] = read(),dp[i][i]=midtree[i],root[i][i]=i;
    	for(int i=1;i<=n+1;++i) {
    		dp[i][i-1]=1;
    	}
    	for(int i=n;i>=1;--i) 
    	{
    		for(int j=i+1;j<=n;++j) 
    		{
    			for(int k=i;k<=j;++k) 
    			{
    				if(dp[i][j]<midtree[k]+dp[i][k-1]*dp[k+1][j]) 
    				{
    					root[i][j]=k;
    					dp[i][j]=midtree[k]+dp[i][k-1]*dp[k+1][j];
    				}
     			}
    		}
    	}
    	printf("%d
    ",dp[1][n]);
    	print(1,n);
    	return 0;
    }
    
  • 相关阅读:
    Rabbit官方文档翻译之Publish Subscribe(三)
    Maven项目导入本地Jar包
    位运算实现整数的加减乘数运算
    SpringMVC通过工具类获取Request域
    终止线程的2种方法。标记法和中断
    Spring 下默认事务机制中@Transactional 无效的原因
    java泛型 泛型的内部原理:类型擦除以及类型擦除带来的问题
    java.lang.Object.clone()分析
    我的Node.js学习历程
    setTimeout的妙用2——防止循环超时
  • 原文地址:https://www.cnblogs.com/sssy/p/7786521.html
Copyright © 2020-2023  润新知