思路:
动态规划
dp[i] = 以a[i]为最后拦截的导弹的情况中最多导弹的情况
递推公式:dp[i] = max(dp[j]+1)(0<j<i并且a[j]>=a[i])
边界条件:dp[0] = 1;
记忆数组生成过程:
可知道:dp数组应按i从小到达的顺序生成
#include <cstdio>
#include <iostream>
#include <string>
#include <math.h>
#include <algorithm>
using namespace std;
int a[30];
int dp[30];
int main() {
int k;
cin >> k;
int i,j;
for (i = 0; i < k; i++) {
cin >> a[i];
}
for (i = 0; i < k; i++) {
dp[i] = 1;
}
for (i = 0; i < k; i++) {
for (j = 0; j < i; j++) {
if (a[j] >= a[i]) {
dp[i] = max(dp[i], dp[j] + 1);
}
}
}
int max1 = 0;
for (i = 0; i < k; i++) {
if (max1 < dp[i]) {
max1 = dp[i];
}
}
cout << max1 << endl;
return 0;
}