能量项链 NOIP2006提高组 区间dp

Posted 行码棋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了能量项链 NOIP2006提高组 区间dp相关的知识,希望对你有一定的参考价值。

题目链接

注意状态方程的计算

直接将链拆开,复制一条链,追加在后面,可以模拟环形相关的问题

状态表示: f [ i ] [ j ] f[i][j] f[i][j]表示区间 [ i , j ] [i,j] [i,j]合并的最大值
转移方程: f [ l ] [ r ] = m a x ( f [ l ] [ r ] , f [ l ] [ k ] + f [ k + 1 ] [ r ] + a [ l ] ∗ a [ k + 1 ] ∗ a [ r + 1 ] ) f[l][r] = max(f[l][r],f[l][k]+f[k+1][r]+a[l]*a[k+1]*a[r+1]) f[l][r]=max(f[l][r],f[l][k]+f[k+1][r]+a[l]a[k+1]a[r+1])

#include<bits/stdc++.h>
using namespace std;
const int N = 205;

int n;
int a[N];
int f[N][N];

int main()
{
    cin>>n;
    for(int i=1;i<=n;i++) 
    {
        cin>>a[i];
        a[i+n] = a[i];
    }
    
    for(int len=1;len<=n;len++)
    {
        for(int i=1;i+len-1<=2*n;i++)
        {
            int l = i,r = i + len-1;
            for(int k=i;k<r;k++)
                f[l][r] = max(f[l][r],f[l][k]+f[k+1][r]+a[l]*a[k+1]*a[r+1]);
        }
    }
    int res = 0;
    for(int i=1;i<=n;i++)
        res = max(res,f[i][i+n-1]);
    cout<<res<<'\\n';
    return 0;
}

以上是关于能量项链 NOIP2006提高组 区间dp的主要内容,如果未能解决你的问题,请参考以下文章

1154 能量项链 2006年NOIP全国联赛提高组 codevs

洛谷P1063 能量项链 [2006NOIP提高组]

NOIP 2006 提高组 t1 能量项链

[NOIP2006] 提高组 洛谷P1063 能量项链

NOIP2006能量项链[环形DP]

codevs 1154 能量项链