【洛谷P1063】能量項鍊【區間DP】
阿新 • • 發佈:2018-11-09
題目大意:
題目連結:https://www.luogu.org/problemnew/show/P1063
有
個珠子圍成一圈,每個珠子有能量值
,合併兩串已串起來的珠子
和
能獲得
能量。求把所有珠子合併的最大能量值。
思路:
很像石子歸併啊,肯定是區間DP。
那麼首先得破環為鏈。
設
為合併
能獲得的最大能量值,那麼很明顯可以列舉一個
,那麼就有
即左邊合併的最大值+右邊合併的最大值+本次合併的能量
答案為
程式碼:
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 210 //破環為鏈陣列開大一倍
using namespace std;
int n,a[N],f[N][N],ans;
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
a[i+n]=a[i]; //破環為鏈
}
for (int i=1;i<=2*n;i++) //列舉右端點
for (int j=i-1;j>0;j--) //列舉左端點
for (int k=j;k<i;k++)
f[j][i]=max(f[j][i],a[j]*a[k+1]*a[i+1]+f[j][k]+f[k+1][i]);
for (int i=1;i<=n;i++)
ans=max(ans,f[i][i+n-1]);
printf("%d\n",ans);
return 0;
}