zoukankan      html  css  js  c++  java
  • poj 2533 Longest Ordered Subsequence(线性dp)

    题目链接:http://poj.org/problem?id=2533

    思路分析:该问题为经典的最长递增子序列问题,使用动态规划就可以解决;

    1)状态定义:假设序列为A[0, 1, .., n],则定义状态dp[i]为以在所有的递增子序列中以A[i]为递增子序列的最后一个数字的所有递增子序列中的最大长度;

    如:根据题目,在所有的以3结尾的递增子序列有[3]和[1, 3],所以dp[2] =2;

    2)状态转移方程:因为当A[j] < A[i]时(0<= j < i),dp[i] = Max(dp[i], dp[j] + 1);

    3)求解:求出所有以A[i]为尾的递增子序列中最大长度,则只需要在求出dp[i]中的最大值即可求解;

    代码如下:

    #include <iostream>
    using namespace std;
    
    const int MAX_N = 1000 + 100;
    int num[MAX_N], dp[MAX_N];
    
    int main()
    {
        int n;
    
        while (scanf("%d", &n) != EOF)
        {
            int ans = 0;
    
            for (int i = 0; i < n; ++i)
                scanf("%d", &num[i]);
            for (int i = 0; i < n; ++i)
                dp[i] = 1;
            for (int i = 0; i < n; ++i)
            {
                for (int j = 0; j < i; ++j)
                {
                    if (num[j] < num[i])
                        dp[i] = dp[j] + 1 > dp[i] ? dp[j] + 1 : dp[i];
                }
            }
            for (int i = 0; i < n; ++i)
                ans = dp[i] > ans ? dp[i] : ans;
            printf("%d
    ", ans);
        }
    
        return 0;
    }
  • 相关阅读:
    以此来励志吧!!!(选自:知乎)
    【P1303】苹果二叉树
    【P1813】8的倍数
    2016.9.4 の 測試
    后缀数组
    个中模板
    基数排序
    【NOIP2014D2T3】解方程
    【HAOI2006】【BZOJ1051】【p1233】最受欢迎的牛
    java安全性-引用-分层-解耦
  • 原文地址:https://www.cnblogs.com/tallisHe/p/4524809.html
Copyright © 2011-2022 走看看