首先bfs
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1005;
int a[N];
int dp[N];
int n;
int dfs(int pos){ // 以pos结尾的递增子序列
int mmax = 1;
for(int i = 0; i < pos; i++){
if(a[i] < a[pos]) mmax = max(dfs(i)+1, mmax);
}
return mmax;
}
int main(int argc, char** argv) {
cin >> n;
for(int i = 0; i < n; i++) cin >> a[i];
int res = 0;
for(int i = 0; i < n; i++){
res = max(dfs(i), res);
}
cout << res;
return 0;
}
记忆化搜索——dp
每次dfs(i)被重复计算,所以空间换时间,将dfs(i)记录,即可降低时间—,即记忆化搜索。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1005;
int a[N];
int dp[N];
int n;
int main(int argc, char** argv) {
cin >> n;
for(int i = 0; i < n; i++) cin >> a[i];
int res = 0;
for(int i = 0; i < n; i++){
dp[i] = 1;
for(int j = 0; j < i; j++)
if(a[i] > a[j])
dp[i] = max(dp[j] + 1, dp[i]);
res = max(dp[i], res);
}
cout << res;
return 0;
}