最长不下降子序列
这里的注释说明更易理解
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
using namespace std;
const int MAXN = N;
int a[MAXN];
int d[MAXN];
int main()
{
int n;
cin>>n;
for (int i = 1; i <= n; i++)
cin>>a[i];
if (n == 0) // 0个元素特判一下
{
cout<<'0'<<'\n';
return 0;
}
d[1] = a[1]; //初始化
int len = 1;
for (int i = 2; i <= n; i++)
{
if (a[i] >= d[len])
d[++len] = a[i];
//如果可以接在len后面就接上,如果是最长上升子序列,这里变成>
else//否则就找一个最该替换的替换掉
{
int j = upper_bound(d + 1, d + len + 1, a[i]) - d;
//找到第一个大于它的d的下标,如果是最长上升子序列,这里变成lower_bound
d[j] = a[i];
}
}
cout<<len<<'\n';
return 0;
}
最长不上升子序列
同理,稍改。 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
using namespace std;
const int MAXN = N;
int a[MAXN], d[MAXN];
int main()
{
int n;
cin >> n;
for (int i = 1; i <= n;i++)
cin >> a[i];
if(n==0)
{
cout << '0' << endl;
return 0;
}
d[1] = a[1];
int len = 1;
for (int i = 2; i <= n;i++)
{
if(a[i]<=d[len])
d[++len] = a[i];
else
{
int pos = upper_bound(d + 1, d + 1 + len, a[i], greater<int>()) - d;
d[pos] = a[i];
}
}
cout << len << endl;
}
最长不下降子序列的内容
1 |
|