导弹拦截问题:
问题分析:想要求得最多可以拦截地导弹数量,其实就是求数组地最大递减序列。我们可以使用基于归纳法地递归很容易就可以写出相应地程序。但是在使用递归的过程中,有很多次重复的比较。因此使用动态规划法可以减少操作次数。
使用动态规划法:首先建一个额外的数组count[]记录每个导弹到来时该系统的最大拦截数量。每次导弹到来时,b一定,可以比较target[a],target[b],(a<b)(其中b的值随导弹到来次数的增加而增大),如果target[a]>target[b],那么count[b]=count[a]+1>count[b]?count[a]+1:count[b].最终就可以得到问题的解。
相关代码:
#include<stdio.h>
#include<math.h>
#define M 8
int maxDis(int a,int count[],int target[]){
int max; //用来登记倒叙最长的串的长度
int i;
int j;
for(i=0;i<a;i++) {
count[i]=1; //给count[]数组赋初值
}
for(i=0;i<a;i++)
for(j=0;j<i;j++){
if(target[j]>target[i])
count[i]=count[i]>(count[j]+1)?count[i]:count[j]+1;
max=max>count[i]?max:count[i]; //从中挑出最大的一个
}
printf("求得的最大导弹拦截数量%d",max);
}
int main(){
int target[]={389,207,155,300,299,170,158,65};
int count[M];
maxDis(M,count,target); //分别表示导弹数量,统计数组,导弹高度数组
}