题目
题解
假设(i,j)开区间内最后一个被戳破的气球是k,
-
状态定义:dp[i][j] 表示在开区间(i,j)内能拿到的最多金币
-
状态转移方程:
如果戳破气球k,则获得的金币数量total=dp[i][k]+dp[k][j]+val[i]*val[k]*val[j]
那么 dp[i][j]=max(total) i<k<j,i<j-1 -
初始条件:
i>=j-1时,dp[i][j]=0 -
返回值:dp[0][n+1]
注意:i,j的取值
class Solution {
public int maxCoins(int[] nums) {
int n=nums.length;
int[][] dp=new int[n+2][n+2];
//val[i]=nums[i-1]
int[] val=new int[n+2];
val[0]=val[n+1]=1;
for(int i=1;i<n+1;i++){
val[i]=nums[i-1];
}
//自右向左动态规划
for(int i=n-1;i>=0;i--){
for(int j=i+2;j<=n+1;j++){
for(int k=i+1;k<j;k++){
int sum=val[i]*val[k]*val[j];
sum+=dp[i][k]+dp[k][j];
dp[i][j]=Math.max(dp[i][j],sum);
}
}
}
return dp[0][n+1];
}
}
时间复杂度: O ( n 3 ) O(n^3) O(n3)
空间复杂度: O ( n 2 ) O(n^2) O(n2)