1. 程式人生 > >能量項鏈

能量項鏈

ons ++ span return AS pan print nbsp pri

技術分享圖片

技術分享圖片

區間dp

定義dp[i][j]=從i合並到j最大能量

此時dp[i][j]可以表示一個珠子的能量

故有轉移方程dp[i][j]=max{dp[i][k]+dp[k+1][k]+A[i]*A[k+1]*A[j+1]),i<=k<j;

為了規避環,將數組擴大兩倍儲存珠子能量

最後ans=max{dp[i][i+n-1]},1<=i<=n;

代碼:

#include<bits/stdc++.h>
using namespace std;
const int N=210;
int A[N],dp[N][N];
int main()
{
    
int n,ans=0; scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&A[i]),A[i+n]=A[i]; for(int v=1;v<n;v++) for(int i=1;i<=2*n-v;i++) { int j=i+v; for(int k=i;k<j;k++) dp[i][j]=max(dp[i][j],dp[i][k]+dp[k+1
][j]+A[i]*A[k+1]*A[j+1]); } for(int i=1;i<=n;i++) ans=max(ans,dp[i][i+n-1]); printf("%d\n",ans); return 0; }

能量項鏈