P1040 加分二叉树
Posted $mathcal{Lance1ot}$
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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);
}
以上是关于P1040 加分二叉树的主要内容,如果未能解决你的问题,请参考以下文章