312. Burst Balloons

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:讨论区中还有一种常用方法,但还没有理解,到时候想到了再来补。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值