导弹拦截(最长下(升)降子序列 dp)

    xiaoxiao2021-03-25  98

    /*题目描述: 某国为了防御敌国的导弹袭击,开发出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度, 但是以后每一发炮弹都不能高于或者等于前一发的高度。某天,雷达捕捉到敌国的导弹来袭,并观测到导弹依次飞来的高度, 请计算这套系统最多能拦截多少导弹。 输入: 第一行输入测试数据组数n(1<=n<=10) 接下来输入 这组测试数据共有多少个导弹m(1<=m<=20) 接下里输入导弹依次飞来的高度,所有高度均是大于0的正整数 输出: 输出最多能够拦截的导弹数目 样列输入  2  8  389 207 155 300 299 170 158 65  3  88 34 65 */ #include<stdio.h>   int main() { int n,m;//n为测试的组数,m为每组数据个数 int h[21]={0};//将m个数据存入,即为每个导弹高度 int dp[20]={0}; int max=0;  scanf("%d\n",&n);    while(n--) //录入组数  {   scanf("%d",&m);//每组共计m个数字      for(int i=0;i<m;i++)//将每组m个数据依次存放入h[i]数组中     {     scanf("%d",&h[i]);     dp[i]=1;//默认导弹可以拦截一枚     int temp=0;     for(int j=0;j<i;j++)//每次存入一个数据均和之前已经存的数比较     {      if (h[i]<h[j])//如果刚录入的数比之前的数小      {       temp=dp[j]+1;//则拦截的导弹数加以一       if(temp>dp[i])//拦截和之前不拦截比较,如果可以拦截后比不拦截数目多        {         dp[i]=temp; //为dp赋新的值        }      }     }     if(dp[i]>max)//录入的数据与之前录入数据比较结果      max=dp[i];     }     printf("%d\n",max);  }  return 0;  }
    转载请注明原文地址: https://ju.6miu.com/read-14401.html

    最新回复(0)