CodeUp
http://codeup.cn/problem.php?cid=100000627&pid=0
关键:
以一个节点为尾的最长不下降子序列(LIS)取决于其前面的所有数。
如果当前数b不小于其前面某个数a时,也就是b可以放在a后面时,我们需要考虑:
如果b跟在a后面的话,以b为尾的LIS是否需要更新(也就是说是否会变得更大),如果更大的话就是我们想要的。
将b前面的所有数这样处理一遍,就可以得到以b为尾的LIS值;
以此类推,比较所有以每一个节点为尾的LIS值就可以得到最大的。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> numVec, dpVec;
int main(){
int N, maxLen = 0;
cin >> N;
numVec.resize(N);
dpVec.resize(N,1);
for(int i = 0; i < N; ++i){
cin >> numVec[i];
for(int j = 0; j < i; ++j){
if(numVec[i] > numVec[j] && dpVec[j] + 1 > dpVec[i]){
dpVec[i] = dpVec[j] + 1;
}
}
maxLen = max(maxLen, dpVec[i]);
}
cout << maxLen << endl;
return 0;
}