经典的最长不下降子序列问题,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>
2using namespace std;
3int a[5001], b[5001];
4int max(int x, int y) {return (x > y) ? x : y;}
5int 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
马上要走了,高中还是麻烦很多,进度让人纠结.