zoukankan      html  css  js  c++  java
  • 输出最长上升子序列 模型(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;
    }

  • 相关阅读:
    Redis命令
    Linux命令
    SQL语句
    Redis集群
    Redis主主复制、主从复制
    关于Java乱码
    组合, 封装, 访问限制机制, property装饰器, 多态
    继承
    小练习
    面向过程与面向对象, 类和对象
  • 原文地址:https://www.cnblogs.com/vongang/p/2147667.html
Copyright © 2011-2022 走看看