【洛谷P1063】NOIP2006能量项链

时间:2023-03-09 01:41:00
【洛谷P1063】NOIP2006能量项链

能量项链

https://www.luogu.org/problemnew/show/P1063

好像比合并石子更水。。

区间动规,f[l][r]表示合并区间l~r的最大能量

按区间长度dp

枚举中间点k

f[l][r]=max(f[l][r],f[l][k]+f[k+1][r]+s[l][0]*s[r][1]*s[k][1]);

对于环形,搞成一个两倍长度的链就行了

 #include<iostream>
#include<cstdio>
#include<algorithm>
#define ll long long
using namespace std;
const int MAXN = ;
ll n,s[MAXN][],f[MAXN][MAXN];
int main()
{
scanf("%lld",&n);
for(int i=;i<=n;i++)
{
scanf("%lld",&s[i][]);
s[i-+n][]=s[i-][]=s[i+n][]=s[i][];
}
s[n<<][]=s[][];
for(int len=;len<=n;len++)
for(int l=;l+len-<=(n<<);l++)
{
int r=l+len-;
for(int k=l;k<r;k++)
f[l][r]=max(f[l][r],f[l][k]+f[k+][r]+s[l][]*s[r][]*s[k][]);
}
ll ans=;
for(int i=;i<=n;i++)
ans=max(ans,f[i][i+n-]);
printf("%lld\n",ans);
return ;
}