sample input
8
4 3 8 5 9 6 7 8
7
10 2 9 3 4 5 10
output
2
3
ps: 因为在同样的个数里分组也有好多办法,所以这里的每个分组内部不一定含有最长不降子序列,但是个数是最少的。
#include <iostream>
using namespace std;
int a[50], b[50];
int main(){
//freopen("in.txt", "r", stdin);
int n, i, j;
while(cin>>n){
int max = 0;
for(i = 0; i < n; i++)
cin>>a[i];
b[0] = 1;
for(i = 1; i < n; i++){
b[i] = 1;
for(j = 0; j < i; j++){
if(a[j] >= a[i] && b[i] == b[j])
b[i] = b[j] + 1;
}
if(b[i] > max)
max = b[i];
}
for(i = 0; i < n; i++)
cout<<"b[i] "<<b[i]<<endl;
cout<<max<<endl;
}
return 0;
}
为什么是b[i] == b[j]?
如果序列是这样11 10 9, 分析9的时候你就发现应该是b[i] == b[j],实际上你会发现要是你写成b[i] <= b[j]也行,但是切勿写成b[i] >= b[j]这样b[i]就会往小里变。
什么时候适合用a[j] >= a[i]?
如果你想求上升的分组,你就这么写。如果你想求不降的分组,那么你可以a[j] > a[j]。同理下降序列的情况。