1. 程式人生 > >單調遞增最長子序列___O(n2)——遞推dp

單調遞增最長子序列___O(n2)——遞推dp

設計一個O(n2)O(n2)時間的演算法,找出由 nn 個數組成的序列的最長單調遞增子序列。

輸入樣例:

5
1 3 5 2 9

輸出樣例:

4

思路:用f[i]f[i]表示前 ii 個最長遞增子序列的長度,那麼遍歷一遍 iif[i]=f[j]+1j<if[i] = f[j] + 1(j<i)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n, a[10005], f[10005]; 

int main(){
	scanf("%d", &n);
	for(int i=1; i<=n; i++) scanf("%d", a+i);
	for(int i=1; i<=n; i++){
		f[i] = 1;
		for(int j=0; j<i; j++)
			if(a[i]>a[j] && f[i]<f[j]+1)
				f[i] = f[j] + 1;
	}
	
	printf("%d", f[n]);
}