要输出最长上升子序列,只需加一个pre数组,记录新加如序列的前一个。最后遍历一遍数组就可以。
代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int N = 1000;
int num[N];
int pre[N];
int dp[N];
int f[N];
int main()
{
freopen("data.in", "r", stdin);
int n, i, j, ans, flag;
while(~scanf("%d", &n))
{
for(i = 1; i <= n; i++)
scanf("%d", &num[i]);
memset(dp, 0, sizeof(dp));
memset(pre, 0, sizeof(pre));
memset(f, 0, sizeof(f));
dp[1] = 1;
for(i = 2; i <= n; i++)
{
ans = dp[i];
for(j = 1; j < i; j++)
{
if(num[i] > num[j] && ans < dp[j])
{
ans = dp[j];
if(!pre[num[i]] && !f[j])
{
pre[num[i]] = num[j]; //记录
f[j] = 1;
flag = num[i];
}
}
}
dp[i] = ans + 1;
}
ans = 0;
i = flag;
while(i)
{
printf("%d ", i);
i = pre[i];
}
for(i = 1; i <= n; i++)
if(dp[i] > ans)
ans = dp[i];
printf("\n%d\n", ans);
}
return 0;
}