输出最长上升子序列 模型(DP)

  要输出最长上升子序列,只需加一个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;
}

posted @ 2011-08-21 09:34  AC_Von  阅读(1431)  评论(0编辑  收藏  举报