P1063-能量項鍊-環狀區間DP
阿新 • • 發佈:2018-12-16
- 注意合併方式價值定義進行區間DP
- 因為是相鄰兩個合併並且有一個剩餘所以列舉中間點k時需要從i開始
- 但是最後要列舉一下剩下的點然後取一個最大值
-
#include<bits/stdc++.h> using namespace std; #define maxn 222 int n,a[maxn],ans; int dp[maxn][maxn]; int main() { scanf("%d",&n); for(int i=1; i<=n; i++) { scanf("%d",&a[i]); a[i+n]=a[i]; } for(int len=1; len<2*n; len++) for(int i=1; i+len<=2*n; i++) { int j=i+len; 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; }