题目:http://ac.jobdu.com/problem.php?pid=1112
#include<cstdio>
#include<algorithm>
using namespace std;
int miss[30];
int f[40] = { 0 };
/*
九度1112: 拦截导弹【寻找最长递减子序列】
递推公式:F[i] = {1, F[j]+1 | j<i && Aj >= Ai}
含义:【王道机试指南 P160】
遍历第i号之前的所有 >=Ai 的字符Aj,若在Aj的最小递减子序列上加上Ai后长度大于现有最大值max,则更新
*/
int main() {
int n;
f[1] = 1;
while (scanf("%d", &n) != EOF) {
for (int i = 1; i <= n; i++) {//输入数据
scanf("%d", &miss[i]);
}
int flag = 1;//记录查找过程中产生的最大值
for (int i = 2; i <= n; i++) {
int max = 1;
for (int j = 1; j < i; j++) {
if (miss[j] >= miss[i] && f[j] + 1 > max){//递推式
max = f[j] + 1;
}
}
f[i] = max;
if (max > flag)
flag = max;
// printf("f[%d] = %d\n", i, f[i]);
}
printf("%d\n", flag);
}//while
return 0;
}