题解 | #Redraiment的走法#
Redraiment的走法
http://www.nowcoder.com/practice/24e6243b9f0446b081b1d6d32f2aa3aa
/*最长升序列*/ #include<iostream> using namespace std; int n; //序列长度 int a[201]; //从1开始存储数据 int len[201]; //每个点开始的最长升序列长度 int p[201]; //以每个点作为开始的(最长升序列)下一个位置 int main() { scanf("%d", &n); for(int i = 1; i <= n; i++) //从a[1]开始储存数据 scanf("%d",&a[i]); len[n] = 1; //最末元素开始的序列只有它自身,长度为1 p[n] = 0; //不存在以最后一个元素为开始的下一个元素 记为0 for(int i = n-1; i >= 1; i--) //从后向前计算每个点的len[i],p[i]; { int maxj = 0,k = 0; for(int j = i+1; j <= n; j++) { if(a[i] < a[j] && len[j] > maxj) { maxj = len[j]; k = j; } } len[i] = maxj + 1; //加上a[i]自身 长度+1 p[i] = k; } int maxlen = 1, s = 0; for(int i = 1; i <= n; i++) { if (len[i] > maxlen) { maxlen = len[i]; s = i; } } cout << maxlen << endl; // while(s != 0) //输出每一步高度 // { // cout << a[s] << ' '; // s = p[s]; // } return 0; }