题目链接:
http://acm.zjnu.edu.cn/CLanguage/showproblem?problem_id=1182
思路:
区间DP。和石子合并其实是同一个题目。只不过要处理环的问题。
对于环,我们可以采用最常用的处理方法,将环断为链。即a[1],a[2]……a[n],a[n+1](a[1]),a[n+2](a[2]),……a[2n-1](a[n-1])。
然后我们就可以通过dp[i][j],表示i~j合起来的最大能量。
转移方程:dp[i][j]=max(dp[i][j],dp[i][k]+dp[k+1][j]+a[i]*a[k+1]*a[j+1])。
代码:
#include<stdio.h>
#include<string.h>
#define ll __int64
int max(int a,int b)
{
return a>b?a:b;
}
int main()
{
int n,i,j,k,a[255],dp[255][255],maxi;
scanf("%d",&n);
maxi=0;
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
for(i=n+1;i<=2*n;i++)
a[i]=a[i-n];
for(k=2;k<=n;k++)
{
for(i=1;i<=2*n-k;i++)
{
int zhong=i+k-1;
for(j=i;j<zhong;j++)
{
dp[i][zhong]=max(dp[i][zhong],dp[i][j]+dp[j+1][zhong]+a[i]*a[j+1]*a[zhong+1]);
}
}
}
for(i=1;i<=n;i++)
maxi=max(maxi,dp[i][i+n-1]);
printf("%d\n",maxi);
return 0;
}