输入导弹依次飞来的高度(雷达给出的高度数据是不大于30000的正整数)
输出这套系统最多能拦截多少导弹,如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。
6
2
导弹的高度<=30000,导弹个数<=20
#include <iostream> #define MAXSIZE 100 int p[MAXSIZE];//表示以下标i为结束的序列的情况 using namespace std; /* 1.就是利用p[i]=max(p[i+1],p[i+1]+a[i]),来求解最多拦截数 2.对于导弹系统就可以通过简单的 逆序数 来求解,线性代数里的问题 */ int dp(int begin,int a[],int end)//就是一个寻找最长递减子序列问题 { int i; int max=-1; for(i=end;i >= begin+1;i--) { if(a[i] <= a[begin] && p[i] > max) { max=p[i]; } } if(max == -1) p[begin]=1; else p[begin]=max+1; if(begin > 0) dp(begin -1,a,end); return 0; } int main() { int d[MAXSIZE]; int n=0,max; int i,j,count=0; cin >> d[n++]; while(cin.get() == ' ') { cin >> d[n++]; } p[n-1]=1; dp(n-2,d,n-1); max=p[0]; for(i=1;i < n;i++) { if(max < p[i]) max = p[i]; } for(i=0;i < n-1;i++) { if(d[i] < d[i+1]) count++; } if(count == n-1) count++; cout << max << endl << count; return 0; }
文章来源: https://blog.csdn.net/qq_42418728/article/details/88201234