题目: https://leetcode-cn.com/problems/burst-balloons/
思路:动态规划
状态:dp[i][j] 表示戳破[i,j]范围内这些气球所能获得的最大数量的硬币
转移方程: dp[i][j] = max(dp[i][j],dp[i][k-1] + dp[k+1][j] + arr[i-1]*arr[k]*arr[j+1]); (i<=k<=j)
方程含义: 选择i到j之间的某一个气球k,然后先戳破 i到k-1之间的气球,再戳破k+1到 j 之间的气球,最后戳破k这个气球。
(先戳破[k+1,j]之间的气球,再戳破[i,k-1]之间的气球,最后戳破k。 跟上面情况的计算结果也一样。)
我们将 k 从i遍历到j,于是覆盖了所有的情况。
因为题目说arr[0] 和 arr[n+1] 都设置为1,所以假如题目给定的气球数目是n,那我们的结果就是dp[1][n];
class Solution {
int max(int a,int b)
{
return a>b?a:b;
}
public int maxCoins(int[] nums) {
int n = nums.length;
int arr[] = new int[n+2];
arr[0] = arr[n+1] = 1;
for(int i=0;i<n;i++)
{
arr[i+1] = nums[i];
}
int dp[][] = new int [n+2][n+2];
for(int span=1;span<=n;span++)//间隔 ,从1~n,因为要从小范围推出大范围。
{
for(int i=1;i<=n-span+1;i++)//选择起点i
{
int j = i + span - 1;//选择终点j
for(int k=i;k<=j ; k++)//选择戳破i到j的某个气球k
{
dp[i][j] = max(dp[i][j],dp[i][k-1] + dp[k+1][j] + arr[i-1]*arr[k]*arr[j+1]);
}
}
}
return dp[1][n];
}
}