递推式 dp[i] = max(dp[i], dp[j] + 1)
根据递推式,代码:
时间复杂化度 n^2
#include <iostream>
using namespace std;
int a[100];
int dp[100];
void solve(){
int n;
cin >> n;
for(int i = 1; i <= n; ++i)
cin >> a[i];
// 核心代码
int res = 0;
for(int i = 1; i <= n; ++i){
dp[i] = 1;
for(int j = 1; j < i; ++j){
if(a[i] > a[j])
dp[i] = max(dp[i], dp[j] + 1);
}
res = max(res, dp[i]);
}
cout << res;
}
int main(){
solve();
return 0;
}
还有一种nlogn的算法,贪心的思维 +二分搜索
#include <iostream>
using namespace std;
// 贪心的不断选取尽可能小的的数填进dp数组里面,这样dp中上升子序列就能尽可能的长
int a[100];
int dp[100];
const int INF = 0x3f3f3f3f;
// 极限最大数
void solve(){
int n;
cin >> n;
for(int i = 0; i < n; ++i)
cin >> a[i];
// 核心代码
fill(dp, dp + n, INF);
// 利用二分搜索
for(int i = 0; i < n; ++i)
*lower_bound(dp, dp + n, a[i]) = a[i];
// 如果a[i]大于dp中任意一个数,就填充进去,如果比中的数小,a[i]就替换dp中第一个大于它的数
cout << lower_bound(dp, dp + n, INF) - dp;
}
int main(){
solve();
return 0;
}