开始想的是每个数字占据一个空间,然后计算。这样实在太低效了,应该只计算出现过的数字就可以了。
后来还想用不用先来一个set将他们映射为连续的数值空间,后来发现完全没必要
#include<iostream>
using namespace std;
const int N = 1010;
int w[N], dp[N];
int main(){
int n; cin >> n;
for(int i=0; i<n; i++) cin >> w[i];
for(int i=0; i<n; i++){
dp[i] = 1;
for(int j=0; j<i; j++){
if(w[i]> w[j])
dp[i] = max(dp[i], dp[j]+1);
}
}
int res = 0;
for(int i=0; i<n; i++) res = max(res, dp[i]);
cout << res;
return 0;
}