dp[i][j]表示从i到j序列,能获得的最大值。
一开始总想着枚举区间中最先选的那个数,后面发现这样做的话,没法继续了。
换一个思路:枚举最后一个选的,一切就豁然开朗了。
class Solution {
public:
int maxCoins(vector<int>& nums) {
int n=nums.size();
int dp[n+3][n+3];
memset(dp,0,sizeof(dp));
int a[n+2];
a[0]=1;
for(int i=1;i<=n;i++)
{
a[i]=nums[i-1];
}
a[n+1]=1;
for(int i=n;i>=1;i--)
{
for(int j=i;j<=n;j++)
{
if(i==j)
{
dp[i][j]=a[i]*a[i-1]*a[i+1];
continue;
}
for(int k=i;k<=j;k++)
{
dp[i][j]=max(dp[i][j],dp[i][k-1]+dp[k+1][j]+a[k]*a[i-1]*a[j+1]);
}
}
}
return dp[1][n];
}
};