- P1063 能量项链
- 注意合并方式价值定义进行区间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; }