继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

dp算法学习实例-js实现

甜酒0917
关注TA
已关注
手记 13
粉丝 2
获赞 23

例:拦截导弹(问题来源:1999年全国青少年信息学(计算机)奥林匹克分区联赛高中组复赛试题第一题)

某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。

输入导弹依次飞来的高度(雷达给出的高度数据是不大于30000 的正整数),计算这套系统最多能拦截多少导弹,并依次输出被拦截的导弹飞来时候的高度。

var ary=[100,389 ,207, 201, 300 ,200, 170 ,158, 65];
var height=30000;
//存储最优路径可用数组或者对象
//  var aryLan={};
var aryLan=[];
//存储备忘录 
var dataBase;
    for(var i=0;i<=30000;i++){
        dataBase=dataBase||[];
        for(var j=0;j<=ary.length;j++){
            dataBase[i]=dataBase[i]||[];
            dataBase[i][j]=-1;
        }       
    }
var test=function(height,ary){
    if(dataBase[height][ary.length]!=-1){
        return dataBase[height][ary.length];
    }
  var temp;
  var data;
  if(ary.length>0){
      temp=ary[0];
      ary=ary.slice(1);
  if(height>=temp){
     data=Math.max(test(height,ary),1+test(temp,ary));
//存储最优路径中的拦截
      if(data==1+test(temp,ary)){
          aryLan[height]=temp;
      }
     }else{  
     data=test(height,ary);
   }
  }else{
     data=0;    
  }
   dataBase[height][ary.length]=data;   
   return data;
}

//输出测试
console.log(test(height,ary));
    while(aryLan[height]){
    console.log(aryLan[height]);
    height=aryLan[height]
}
打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP