NOIP2006提高组 能量项链
题目
这道题是一道区间DP的题目具体推导过程有参看洛谷题解
对于将两颗珠子合并为一颗珠子,能量=左边一颗珠子*右边一颗珠子*右边的下一颗珠子;
三颗珠子合在一起,能量max = max(左边两颗珠子合在一起的能量+合并后与右边一颗珠子合并的能量, 右边两颗珠子合并后的能量+合并后与左边一颗珠子合并在一起的能量)。
于是得到了代码中的状态转移方程
#include<iostream>
#include<cstdio>
#include<algorithm> using namespace std;
typedef long long ll; const int MAXN = 300; int n; ll val[MAXN], f[MAXN][MAXN]; ll answer=-1;
int main() { // freopen("energy.in","r",stdin); // freopen("energy.out","w",stdout); scanf("%d", &n); for(int i = 1; i <= n; i++) {
scanf("%lld", &val[i]);
val[i+n] = val[i];
} for(int i = 2; i < 2*n; i++) for(int j = i-1; i-j<n && j>=1; j--) {
for(int k = j; k < i; k++) f[j][i] = max(f[j][i], f[j][k]+f[k+1][i]+val[j]*val[k+1]*val[i+1]); if(f[j][i] > answer) answer = f[j][i]; } printf("%lld", answer); return 0; }