//设上升序列的最后一个数字为第i个,那么就以第i-1个位分类标准, //i-1可以没有,也可以是在数组中下标为1,下标为2 //一直到下标为i-1的数字 #include <iostream> #include <algorithm> using namespace std; const int N = 1010; int n; int a[N], f[N]; 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; // 开始假设有a[i]一个数 for (int j = 1; j < i; j ++ ) if (a[j] < a[i])//是否满足上升 f[i] = max(f[i], f[j] + 1); } int res = 0; for (int i = 1; i <= n; i ++ ) res = max(res, f[i]); printf("%d ", res); return 0; }
输出路径
#include <iostream> #include <algorithm> using namespace std; const int N = 1010; int n; int a[N], f[N]; int g[N];//存储每一个转移是怎么转移过来的,每一个转移是怎么做出来的 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; // 开始假设有a[i]一个数 g[i]=0;//如果为0,表示只有一个数 for (int j = 1; j < i; j ++ ) if (a[j] < a[i])//是否满足上升 if(f[i]<f[j]+1) { f[i]=f[j]+1; g[i]=j;//i状态是从j状态转移过来的 } } int k=1;//记录最优解的下标 for(int i=1; i<=n; i++) if(f[k]<f[i]) k=i; cout<<f[k]<<endl;//输出最大长度 for(int i=0,len=f[k]; i<len; i++) {//一共f[k]个值 cout<<a[k]<<" ";//因为f[k]是以第k个数字结尾的序列,所以先把第k个输出 k=g[k];//从哪个转移过来 } return 0; }