loj10148. 「一本通 5.1 例 2」能量项链

思路:
  区间dp

#include<cstdio>
#include<iostream>
#include<cstdio>
using namespace std;
const int maxn = 210;
inline void qread(int &x){
    x = 0;
    register int ch = getchar();
    while(ch < '0' || ch > '9')    ch = getchar();
    while(ch >= '0' && ch <= '9')    x = 10 * x + ch - 48, ch = getchar();
}
int dp[maxn << 1][maxn << 1];
int n;
int data[maxn << 1];
int main(void){
    qread(n);
    for(int i=1; i<=n; ++i){
        qread(data[i]);
        data[i+n] = data[i];
    }
    data[n << 1 | 1] = data[1];
    for(int L = 1; L < n; ++L)
        for(int i = 1; i <= 2 * n - L; ++i){
            int j = i + L;
            dp[i][j] = 0;
            for(int k = i; k < j; ++k)
                dp[i][j] = max(dp[i][j], dp[i][k] + dp[k + 1][j] + data[i] * data[k + 1] * data[j + 1]);        
        }
    int ans = 0;
    for(int i=1; i<=n; ++i)    ans = max(ans, dp[i][i + n -1]);
    printf("%d\n", ans);    
}

 

posted @ 2018-08-16 13:55  junk_yao  阅读(219)  评论(0)    收藏  举报