例:拦截导弹(问题来源: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]
}