求最长不增子序列与求最长递增子序列类似,只是状态转移方程有区别:
dp[ i ] = max (1, dp[ j ] + 1 | j < i && arr[ j ] >= arr[ i ])
#include<iostream>
#include<cstdio>
using namespace std;
const int N = 30;
int main(){
int n, arr[N], dp[N];
while(scanf("%d", &n) != EOF){
for(int i = 0; i < n; i++) scanf("%d", &arr[i]);
int sum = 0;
for(int i = 0; i < n; i++){
dp[i] = 1;
for(int j = 0; j < i; j++){
if(arr[i] <= arr[j]){
dp[i] = max(dp[i], dp[j] + 1);
}
}
sum = max(sum, dp[i]);
}
printf("%d\n", sum);
}
return 0;
}