题解 | #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;
}

查看7道真题和解析