式は右ですが、それが何のACではない最初の時間
f[l][r]=max{f[l][k]+f[k][r]+a[l]*a[k]*a[r]|l<k<r}
R = I + L、F [L] [R]は、L + 1 = I + 1ビーズ重合後に得られることができるR-RにLから最大総エネルギーを示します
問題を解決するには、2つのチェーンがリングに分割されたときに問題がチェーンに再び存在していなかった、変わりました
最初のループのループがある場合、私はありません1〜Nが、2〜N + 1ための中間体遮断されます
変形式:DP間隔式:F [I] [J] =最大{F [i]が[K] + F [K + 1] [J] +}決定
私は愚かな書かれた式のセットを設定する前にf[l][k]+f[k+1][r]+a[l]*a[k]*a[r]
*実際のk + 1が使用されていない、質問の意味が隣接する二つのビーズの合併を意味するので、kは第1のビードと第二のビーズヘッドマークテールマークして、彼らは同じ番号です
ACコード:
#include<iostream>
using namespace std;
int n,ans,f[210][210],a[210];
int main()
{
cin>>n;
for(int i=1; i<=n; i++)
{
cin>>a[i];
a[n+i]=a[i];
}
for(int i=2; i<=n+1; i++)//注意i的循环头尾
{
for(int l=1; l+i-1<=2*n;l++)//注意链是到2n
{
int r=l+i-1;
for(int k=l+1;k<=r-1;k++)//k位于lr之间
{
f[l][r]=max(f[l][r],f[l][k]+f[k][r]+a[l]*a[k]*a[r]);//套公式
ans=max(ans,f[l][r]);
}
}
}
cout<<ans;
return 0;
}