为了账号安全,请及时绑定邮箱和手机立即绑定

dp算法学习实例-js实现

标签:
JavaScript

例:拦截导弹(问题来源: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]
}
点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消