问题描述:
思路:
在了解了一点区间dp的基础上,我们知道要从小区间最优化推导到大区间最优化。
那么这题也是一样:dp[i][j] 代表区间i,j最优释放的能量。
递推式:dp[i][j] = dp[i][k]+dp[k+1][j]+a[i]*a[j+1]*a[k+1]。
至于环形问题 :我们把数组扩大一倍,对2*n堆算出dp[i][j],结果枚举dp[i][i+n-1],取最大即可。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int INF = 0x3f3f3f3f;
const int N = 110;
int dp[N*2][N*2];// 代表区间i,j最优释放的能量
int a[N*2];
int main()
{
int n;
while(~scanf("%d",&n))
{
for(int i = 0; i < n; i++)
{
scanf("%d",&a[i]);
a[i+n] = a[i];
}
memset(dp,0,sizeof(dp));
for(int len = 1; len < n*2; len++)
{
for(int i = 0; i+len < n*2; i++)
{
int l = i, r = i+len;
for(int k = l; k < r; k++)
dp[l][r] = max(dp[l][r],dp[l][k]+dp[k+1][r]+a[l]*a[r+1]*a[k+1]);
}
}
int maxn = 0;
for(int i = 0; i < n; i++)
maxn = max(maxn,dp[i][i+n-1]);
printf("%d\n",maxn);
}
return 0;
}