- DP
- f[i][j]=max { f[i][k-1] + f[k+1][j] + nums[i-1] * nums[k] * nums[j+1] }
- 戳破 i~j 的气球,最后一个戳破的气球是 k
312. 戳气球
class Solution {
public:
int maxCoins(vector<int>& nums) {
int n=nums.size();
if (n==0) return 0;
int f[n+5][n+5];
for (int i=0;i<n;i++)
for (int j=0;j<n;j++) f[i][j]=0;
for (int i=0;i<n;i++){
if (i==0 && i==n-1) return nums[0];
if (i==0) f[i][i]=nums[i+1]*nums[i];
else if (i==n-1) f[i][i]=nums[i-1]*nums[i];
else f[i][i]=nums[i-1]*nums[i]*nums[i+1];
}
for (int p=2;p<=n;p++)
for (int i=0;i+p-1<n;i++){
int j=i+p-1;
for (int k=i;k<=j;k++){
int help=0;
if (i==0){
if (j==n-1) help=1;
else help=nums[j+1];
}
else if (j==n-1){
help=nums[i-1];
}
else help=nums[i-1]*nums[j+1];
if (k==i){
f[i][j]=max(f[k+1][j]+nums[k]*help,f[i][j]);
continue;
}
if (k==j){
f[i][j]=max(f[i][k-1]+nums[k]*help,f[i][j]);
continue;
}
f[i][j]=max(f[i][k-1]+f[k+1][j]+help*nums[k],f[i][j]);
}
}
return f[0][n-1];
}
};