链接: 312. 戳气球
关键思路:我们观察戳气球的操作,发现这会导致两个气球从不相邻变成相邻,使得后续操作难以处理。于是我们倒过来看这些操作,将全过程看作是每次添加一个气球。
public int maxCoins(int[] nums) {
int len = nums.length;
int[] arr = new int[len + 2];
System.arraycopy(nums,0,arr,1,len);
arr[0] = 1;
arr[len+1] = 1;
int[][] dp = new int[len+2][len+2];
for (int i = len; i >= 1; i--) {
for (int j = i ; j <= len; j++) {
dp[i][j] = Integer.MIN_VALUE / 2;
for (int k = i; k <= j; k++) {
dp[i][j] = Math.max(dp[i][j],dp[i][k-1] + dp[k+1][j] + arr[i-1] * arr[k] * arr[j+1]);
}
}
}
return dp[1][len];
}
状态转移方程可以看作 第一次再区间i,j中添加第k个气球,那么左右两边就是[i-1]和[j+1]。进而可以继续递推。