1、留坑吧。。。看不懂别人的代码(2016-10-17已填一半坑)
2、2016-10-17填坑:一个超时的答案:
public class Solution {
public int maxCoins(int[] nums) {
int len=nums.length;
int[] a=new int[len+2];
a[0]=1;
a[len+1]=1;
for(int i=1;i<len+1;i++)
a[i]=nums[i-1];
return burst(a,0,len+1);
}
int burst(int[] a, int left, int right) {
if(right==left+1)
return 0;
// if(right==left+2) return a[left+1];
int max=0;
for(int i=left+1;i<right;i++){
//max=Math.max(max,a[i-1]*a[i]*a[i+1]+burst(a,left,i)+burst(a,i,right));
max=Math.max(max,a[left]*a[i]*a[right]+burst(a,left,i)+burst(a,i,right));
}
// System.out.println("max="+max);
return max;
}
}
3、将上面的改进之后:
public class Solution {
public int maxCoins(int[] nums) {
int len=nums.length;
int[] a=new int[len+2];
int[][] record=new int[len+2][len+2];
a[0]=1;
a[len+1]=1;
for(int i=1;i<len+1;i++)
a[i]=nums[i-1];
return burst(a,record,0,len+1);
}
int burst(int[] a,int[][]record, int left, int right) {
if(right==left+1)
return 0;
if(record[left][right]>0) return record[left][right];
// if(right==left+2) return a[left+1];
for(int i=left+1;i<right;i++){
//max=Math.max(max,a[i-1]*a[i]*a[i+1]+burst(a,left,i)+burst(a,i,right));
record[left][right]=Math.max(record[left][right],a[left]*a[i]*a[right]+burst(a,record,left,i)+burst(a,record,i,right));
}
return record[left][right];
}
}//14ms
3、初步理解这道题,主要过了这3个关卡,后面还要加深理解:
1)例如3个数2,3,4;在程序执行中首先抽取出3,但在理解上是认为3是最后面抽出来的,这样的话,假设抽出2,执行1*2*3,然后抽出4,执行3*4*1,因为理解上认为3是最后抽出来的,所以抽2和4都有*3;
2)理解下面这条语句中的“a[left]*a[i]*a[right]”,例如3,1,5,8,扩展后为1,3,1,5,8,1,当i=3时,a[3]=5因为理解上是最后抽出来的,所以3,1,8在理解上都会比5先出,故而当5要抽出来时,5的左右都为1了
max=Math.max(max,a[left]*a[i]*a[right]+burst(a,left,i)+burst(a,i,right));
3)record[left][right]记录的是left到right串的运行后最小值,如果没有这个数组,就像是暴力破解,如我的第一种代码,无法通过。
4、注1:因为第一点不懂,看不懂别人的代码,知道看到博客点击打开链接里面的这句话:
假设[i...j]中以k,作为分割点。先破k。
那么 [i, k] and [k, j] 并不是互相独立的。因为他们之间还可以交际。
但是,如果假设,k是最后一个破裂的,那么, [i, k] and [k, j] 就是互相独立的了。
才知道(leetcode上的英文理解不了,意思应该和这差不多,所以自己用了很久查资料。。。。)
注2:没有理解3的2)导致写出了Math.max(max,a[i-1]*a[i]*a[i+1]+burst(a,left,i)+burst(a,i,right));,加粗的是写错的;
注3:没有记录数组record,时间太长无法通过;
注4:讨论区中还有一种常用方法,但还没有理解,到时候想到了再来补。