https://ac.nowcoder.com/acm/problem/15759
最长不下降子序列的模板,直接食用。
下面重点理解核心代码:
b[i] = 1; // 每次先把自己算进来,自己的个数,当然是1
for(int j = 1; j < i; j++)
if(a[j] <= a[i]) b[i]=max(b[i], b[j]+1);
(1)j < i, 算过自己,就不要再算了,依次看看之前有几个比我小
(2)b[i]=max(b[i], b[j]+1) 如果 之前有一个数(a[j])比我小,比你小的个数(b[j])加1(加上自身)和自身取最大
(3)cnt = max(b[i], cnt) 每次取最大的数
ac代码
#include<bits/stdc++.h>
#define ios ios::sync_with_stdio(false);cin.tie(0)
#define rep(i,a,b) for(int i=a;i<=b;++i)
using namespace std;
int a[105], b[105];
void sovle()
{
int n;
while(cin>>n&&(n!=0))
{
rep(i,1,n) cin >> a[i];
int cnt = 0;
rep(i,1,n)
{
b[i] = 1; // reset
for(int j = 1; j < i; j++){
if(a[j] <= a[i]) b[i]=max(b[i], b[j]+1); // 如果之前的数小于这个数,添加进来
}
cnt = max(b[i], cnt);
}
cout << cnt <<endl;
}
}
int main()
{
ios;
sovle();
return 0;
}