AcWing 320. 能量項鍊

題目鏈接:點擊這裏
在這裏插入圖片描述
在這裏插入圖片描述

和矩陣連乘很像。

f[L,R]f[L,R] 表示所有將 [L,R][L,R] 合併成一個珠子(矩陣)的方式的最大值。

狀態轉移方程:

f[L,R]=max(f[L,K]+f[K,R]+w[L]w[K]w[R])f[L,R]=max(f[L,K]+f[K,R]+w[L]*w[K]*w[R])

技巧:環拆鏈並複製一倍,問題就變成了直線上相鄰珠子的合併,每一個長度爲 n+1n+1 的區間對應着環形下的一種情況。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>

using namespace std;
const int N = 210;

int w[N];
int f[N][N];

int main()
{
    int n;
    scanf("%d", &n);
    for(int i = 1; i <= n; ++i)
    {
        scanf("%d", &w[i]);
        w[i + n] = w[i];
    }
    
    for(int len = 3; len <=  n + 1; len++)
    {
        for(int l = 1; l + len - 1 <= 2 * n; l++)
        {
            int r = l + len - 1;
            
            for(int k = l + 1; k < r; k++)
            {
                f[l][r] = max(f[l][r], f[l][k] + f[k][r] + w[l] * w[k] * w[r]);
            }
        }
    }
    
    int ans = 0;
    for(int i = 1; i <= n; ++i) ans = max(ans, f[i][i + n]);
    
    printf("%d\n", ans);
    
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章