classSolution{// 思路:关心【最后一个被爆的气球】,就不用关心后效性了(毕竟之后已经没有气球了)publicintmaxCoins(int[] nums){// 1. init: 处理开头、结尾边界(数字为 1 的气球)int n = nums.length;int[] temp =newint[n +2];
temp[0]=1;
temp[n +1]=1;for(int i =0; i < n; i++){
temp[i +1]= nums[i];}// 2. dp[i][j]: 开区间 (i, j) 的最大收益int[][] dp =newint[n +2][n +2];// 1)从小到大,开区间大小从 3 开始for(int len =3; len <= n +2; len++){// 2)左边界for(int i =0; i <= n +2- len; i++){int res =0;// 3)被害气球k,取值范围开区间(i, i + len)for(int k = i +1; k < i + len -1; k++){int left = dp[i][k];int right = dp[k][i + len -1];// 迭代维护当前 i 开头,大小为 len 的区间,可取的最大值
res =Math.max(res, left + temp[i]* temp[k]* temp[i + len -1]+ right);}// 更新(i, i + len - 1)最大利益值
dp[i][i + len -1]= res;}}return dp[0][n +1];}}
无注释版
classSolution{publicintmaxCoins(int[] nums){int n = nums.length;int[] temp =newint[n +2];
temp[0]=1;
temp[n +1]=1;for(int i =0; i < n; i++){
temp[i +1]= nums[i];}int[][] dp =newint[n +2][n +2];for(int len =3; len <= n +2; len++){for(int i =0; i <= n +2- len; i++){int res =0;for(int k = i +1; k < i + len -1; k++){int left = dp[i][k];int right = dp[k][i + len -1];
res =Math.max(res, left + temp[i]* temp[k]* temp[i + len -1]+ right);}
dp[i][i + len -1]= res;}}return dp[0][n +1];}}
二刷
再放送!还是觉得思路很强,期待三刷的时候能一股脑写出来!
classSolution{publicintmaxCoins(int[] nums){// 1、init: 数组头尾都添加元素 1int[] arr =newint[nums.length +2];
arr[0]=1;
arr[nums.length +1]=1;for(int i =1; i <= nums.length; i++){
arr[i]= nums[i -1];}// 2、dp过程,三重循环1)2)3)int[][] dp =newint[arr.length][arr.length];// dp[i][j]: 开区间 (i, j) 的最大值// 1)开区间长度 len:初始为 3,最大为 arr.lengthfor(int len =3; len <= arr.length; len++){// 2)左边界 i:初始为 0,最大为长度为 len 的开区间的最大值for(int i =0; i < arr.length - len +1; i++){int res =0;// 3)被害气球 j:从(i, i + len - 1)中选一个被害气球 j for(int j = i +1; j < i + len -1; j++){// 最优子结构 left、rightint left = dp[i][j];int right = dp[j][i + len -1];// 状态转移方程:子结构 + 爆炸取值
res =Math.max(res, left + arr[i]* arr[j]* arr[i + len -1]+ right);}// 每次获取(i, i + len - 1)的dp值,即范围(i, i + len - 1)的最大值
dp[i][i + len -1]= res;}}return dp[0][arr.length -1];// 返回整个数组的最大值}}
趁热手打
classSolution{publicintmaxCoins(int[] nums){int[] arr =newint[nums.length +2];
arr[0]=1;
arr[nums.length +1]=1;for(int i =1; i < arr.length -1; i++){
arr[i]= nums[i -1];}int[][] dp =newint[arr.length][arr.length];for(int len =3; len <= arr.length; len++){for(int i =0; i < arr.length - len +1; i++){int res =0;for(int j = i +1; j < i + len -1; j++){int left = dp[i][j];int right = dp[j][i + len -1];
res =Math.max(res, left + arr[i]* arr[j]* arr[i + len -1]+ right);}
dp[i][i + len -1]= res;}}return dp[0][arr.length -1];}}