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\n", ans);
    }

    return 0;
}
posted @ 2015-05-23 19:57  Leptus  阅读(148)  评论(0编辑  收藏  举报