P1040 加分二叉树

P1040 加分二叉树

对于有些dp来说,记忆化的正向思维会使人更好理解233.

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
long long memory[50][50];
int root[50][50];
long long data[50];
int n;
long long dfs(int l,int r)
{
	if(memory[l][r])
		return memory[l][r];
	if(l==r)
	{
		memory[l][r]=data[l];
		return memory[l][r];
	}
	if(l>r)
	{
		memory[l][r]=1;
		return 1;
	}
	long long ans=0;
	for(int i=l;i<=r;i++)
		if(ans<dfs(l,i-1)*dfs(i+1,r)+data[i])	
		{
			ans=memory[l][i-1]*memory[i+1][r]+data[i];
			root[l][r]=i;
		}
	memory[l][r]=ans;
	return ans;
}
void print(int l,int r)
{
	if(l>r)
		return ;
	printf("%d ",root[l][r]);
	print(l,root[l][r]-1);
	print(root[l][r]+1,r);
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		root[i][i]=i;
	for(int i=1;i<=n;i++)
		scanf("%lld",&data[i]);
	printf("%lld\n",dfs(1,n));
	print(1,n);
}
posted @ 2018-05-21 21:24  Lance1ot  阅读(152)  评论(0编辑  收藏  举报