经典的最长不下降子序列问题,O(n^2)【还存在基于二分查找的O(nlogn)算法】
方程:if(a[j]<=a[i]) f[i] = max{f[j]} (0<j<i, 1<i<=n)
可能是今天状态不好,一直在纠缠细节.需要注意的是,子序列长度的最大值不一定在f[n]中.
1
#include<iostream>
2
using namespace std;
3
int a[5001], b[5001];
4
int max(int x, int y)
{return (x > y) ? x : y;}
5
int main()
6

{
7
int i, j, n, ans;
8
cin >> n;
9
for (i = 1; i <= n; i++)
{cin >> a[i]; b[i] = 1;}
10
for (i = 2; i <= n; i++)
11
{
12
for (j = 1; j < i; j++)
13
if (a[j] <= a[i] && b[j]+1 > b[i])
14
b[i] = b[j]+1;
15
}
16
for (i = 1; i <= n; i++)
17
if (ans < b[i]) ans = b[i];
18
cout << ans << endl;
19
}
20
马上要走了,高中还是麻烦很多,进度让人纠结.