d[l][i]表示:从第i个珠子开始,连续l个珠子合并后释放的最大能量
状态转移方程d[l][i] = d[j][i] + d[l-j][i+j] + w[i]*w[i+j]*w[i+l],j从1到l-1
注意实际操作时i+j和i+l要mod n.
代码:
#include<iostream> #include<cstring> using namespace std; int n; int w[1005]; int dp[1005][1005]; int main(){ memset(dp,0,sizeof(dp)); cin>>n; for(int i=0;i<n;i++){ cin>>w[i]; } for(int len=2;len<=n;len++){ for(int i=0;i<n;i++){ for(int j=1;j<=len-1;j++){ int temp=dp[j][i]+dp[len-j][(i+j)%n]+w[i]*w[(i+j)%n]*w[(i+len)%n]; dp[len][i]=max(dp[len][i],temp); } } } int ans=0; for(int i=0;i<n;i++){ ans=max(ans,dp[n][i]); } cout<<ans<<endl; }