拦截导弹(动态规划)

导弹拦截问题:



问题分析:想要求得最多可以拦截地导弹数量,其实就是求数组地最大递减序列。我们可以使用基于归纳法地递归很容易就可以写出相应地程序。但是在使用递归的过程中,有很多次重复的比较。因此使用动态规划法可以减少操作次数。

使用动态规划法:首先建一个额外的数组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); //分别表示导弹数量,统计数组,导弹高度数组 
} 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值