1.问题
2.伪代码
Input:N,data[i];
Output: max_count;
Int dp[cMax] = {0}
Int max_count=0
For i from 2 to N do
For j from i-1 to 1 do
If data[i]<=data[j] then
dp[i]<--max(dp[i],dp[j]+1)
if dp[i]>max_count
max_count<--dp[i]
3.源代码及结果
#include <bits/stdc++.h>
#define cMax 15
using namespace std;
int main() {
int max_count = 0;
int N;
int data[cMax]; //表示第i个导弹的高度
int dp[cMax] = {0}; //表示前i个数据构成的子串中,最长下降子序列的长度
cin >> N;
for (int i = 1; i <= N; i++) {
cin >> data[i];
dp[i] = 1;
}
for (int i = 2; i <= N; i++) {
for (int j = i - 1; j >= 1; j--) {
if (data[i] <= data[j]) {
dp[i] = max(dp[i], dp[j] + 1);
}
if (dp[i] > max_count)
max_count = dp[i];
}
}
cout << max_count << endl;
return 0;
}
运行结果:
4.分析
Max_count用来记录最大下降子序列长度,data[]数组用来存放数据,dp[]数组用来记录前i个数据构成的子串中,最长下降子序列的长度。根据状态转移方程即可求出结果,时间复杂度为O(n*n);