华师一附中OI组
标题:
P1040 加分二叉树
[打印本页]
作者:
admin
时间:
2018-6-29 18:36
标题:
P1040 加分二叉树
https://www.luogu.org/problemnew/show/P1040
题目描述
设一个 nn 个节点的二叉树tree的中序遍历为( 1,2,3,…,n),其中数字 1,2,3,…,n 为节点编号。每个节点都有一个分数(均为正整数),记第 ii 个节点的分数为 di,tree 及它的每个子树都有一个加分,任一棵子树 subtree(也包含 tree本身)的加分计算方法如下:
subtree 的左子树的加分× subtree 的右子树的加分+ subtree 的根的分数。
若某个子树为空,规定其加分为 1 ,叶子的加分就是叶节点本身的分数。不考虑它的空子树。
试求一棵符合中序遍历为( 1,2,3,…,n )且加分最高的二叉树 tree 。要求输出;
(1) tree 的最高加分
(2) tree 的前序遍历
输入输出格式
输入格式:
第 1行: 1 个整数 n(n<30) ,为节点个数。
第 2 行: n 个用空格隔开的整数,为每个节点的分数(分数 <100 )。
输出格式:
第 1 行:1 个整数,为最高加分(Ans ≤4,000,000,000 )。
第 2 行: n 个用空格隔开的整数,为该树的前序遍历。
输入输出样例
输入样例#1:
5
5 7 1 2 10
输出样例#1:
145
3 1 2 4 5
作者:
倚窗倾听风吹雨
时间:
2018-9-9 09:58
本帖最后由 倚窗倾听风吹雨 于 2018-9-9 10:27 编辑
区间dp,f(i,j)表示i~j之间组成子树的最大值;
#include<iostream>
using namespace std;
int n,ans,a[30],f[30][30],gra[30],root[30][30];
void print(int l,int r)
{
if(l>r)return;
if(l==r)
{
cout<<l<<" ";
return;
}
cout<<root[l][r]<<" ";
print(l,root[l][r]-1);
print(root[l][r]+1,r);
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>gra[i];
a[i]=i;
f[i][i]=gra[i];
f[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(f[i][j]<f[i][k-1]*f[k+1][j]+f[k][k])
{
f[i][j]=f[i][k-1]*f[k+1][j]+f[k][k];
root[i][j]=k;
}
cout<<f[1][n]<<endl;
print(1,n);
return 0;
}
复制代码
作者:
universehyf
时间:
2018-10-3 23:39
区间DP
#include<iostream>
using namespace std;
#define FOR(i,n,m) for(int i=n;i<=m;i++)
int n,a[110];
int f[110][110][2];
void dfs(int l,int r)
{
if(l>r) return;
if(l==r) {cout<<l<<" ";return;}
cout<<f[l][r][1]<<" ";
dfs(l,f[l][r][1]-1);
dfs(f[l][r][1]+1,r);
}
int main()
{
cin>>n;FOR(i,1,n) cin>>a[i];
FOR(i,1,n) f[i][i][0]=a[i];
FOR(i,2,n) FOR(j,1,n-i+1) FOR(k,j,i+j-1)
{
if(!f[j][k-1][0]) f[j][k-1][0]=1;if(!f[k+1][i+j-1][0]) f[k+1][i+j-1][0]=1;
if(f[j][k-1][0]*f[k+1][i+j-1][0]+a[k]>f[j][i+j-1][0])
{
f[j][i+j-1][0]=f[j][k-1][0]*f[k+1][i+j-1][0]+a[k];
f[j][i+j-1][1]=k;
///cout<<j<<" "<<i+j-1<<" "<<k<<" "<<f[j][i+j-1][0]<<' '<<f[j][i+j-1][1]<<endl;
}
}
cout<<f[1][n][0]<<endl;
dfs(1,n);
return 0;
}
复制代码
欢迎光临 华师一附中OI组 (http://hsyit.cn/)
Powered by Discuz! X3.2