能量項鏈
阿新 • • 發佈:2018-06-29
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; }
能量項鏈