[概要]エネルギーネックレス(NOIP2006)

式は右ですが、それが何の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;
}

おすすめ

転載: www.cnblogs.com/fox-nest/p/12217009.html
おすすめ