LOJ #10158. 「一本通 5.2 练习 1」加分二叉树

中序遍历是1,2,3,…,n,所以转化为一个区间dp喽。
考察了关于中序遍历的认识。
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=35;
int n;
int a[N],f[N][N],g[N][N];

void dfs(int l,int r)
{
	if (l>r) return;
	printf("%lld ",g[l][r]);
	dfs(l,g[l][r]-1);
	dfs(g[l][r]+1,r);
}

signed main(){
	scanf("%lld",&n);
	for (register int i=1; i<=n; ++i) scanf("%lld",&a[i]),f[i][i]=a[i],g[i][i]=i;
	for (register int l=2; l<=n; ++l)
	for (register int i=1; i+l-1<=n; ++i)
	{
		int j=i+l-1;
		f[i][j]=a[i]+f[i+1][j]; g[i][j]=i;
		if (a[j]+f[i][j-1]>f[i][j]) f[i][j]=a[j]+f[i][j-1],g[i][j]=j;
		for (register int k=i+1; k<j; ++k)
		{
			if (a[k]+f[i][k-1]*f[k+1][j]>f[i][j]) f[i][j]=a[k]+f[i][k-1]*f[k+1][j],g[i][j]=k;
		}
	}
	printf("%lld\n",f[1][n]);
	dfs(1,n);
return 0;
}
发布了64 篇原创文章 · 获赞 29 · 访问量 680

猜你喜欢

转载自blog.csdn.net/Dove_xyh/article/details/103861552
今日推荐