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];}}
ANDRITZ to supply gasification plant and biomass handling line to Klabin’s Puma II project in Brazil.国际技术集团公司安德里茨收到KLabin的订单,为其位于巴西的Ortigueira浆厂提供一台完整的生物质气化炉和一条新的生物质处理线。International technology…