zoukankan      html  css  js  c++  java
  • POJ 2533 最长上升子序列

    
    
     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <algorithm>
     5 #define sc(x) scanf("%d",&(x))
     6 #define pf(x) printf("%d
    ", x)
     7 using namespace std;
     8 const int MAX = 1005;
     9 int arr[MAX], N, ans, dp[MAX];
    10 int main()
    11 {
    12     int i, j;
    13     sc(N);
    14     for (i = 1; i <= N; i++)
    15         sc(arr[i]);
    16     ans = 0;
    17     for (i = 1; i <= N; i++)
    18     {
    19         dp[i] = 1;
    20         for (j = 1; j <= i - 1; j++)
    21         {
    22             if (arr[j] < arr[i] && dp[i] < dp[j] + 1) // dp[i]表示以a[i]结尾的最长子序列长度
    23                 dp[i] = dp[j] + 1;
    24         }
    25 
    26         if (dp[i] > ans) ans = dp[i];     // ans记录最长子序列
    27     }
    28     pf(ans);
    29     return 0;
    30 }
    View Code

    思路1:
    令A[i]表示输入第i个元素,D[i]表示从A[1]到A[i]中以A[i]结尾的最长子序列长度。对于任意的0 < j <= i-1,如果A(j) < A(i),则A(i)可以接在A(j)后面形成一个以A(i)结尾的新的最长上升子序列。对于所有的 0 < j <= i-1,我们需要找出其中的最大值。

    DP状态转移方程:

    D[i] = max{D[i], D[j] + 1} (j = 1, 2, 3, ..., i-1 且 A[j] < A[i])

    解释一下这个方程,i, j在范围内:

    如果 A[j] < A[i] ,则D[i] = D[j] + 1

    如果 A[j] >= A[i] ,则D[i] = D[j]

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #define sc(x) scanf("%d",&(x))
    #define pf(x) printf("%d
    ", x)
    #define CL(x, y) memset(x, y, sizeof(x))
    using namespace std;
    const int MAX = 1005;
    int arr[MAX], N, ans, tmp, dp[MAX];
    int main()
    {
        int i, j;
        CL(arr, 0);
        CL(dp, 0);
        sc(N);
        for(i = 1; i <= N; i++)
            sc(arr[i]);
        dp[1] = 1;
        for(i = 2; i<= N; i++) //每次求以第i个数为终点的最长上升子序列的长度
        {
            tmp = 0; //记录满足条件的,第i个数左边的上升子序列的最大长度
            for(j = 1; j < i; j++) //察看以第j个数为终点的最长上升子序列
                if(arr[i] > arr[j])
                    if(tmp < dp[j])//保留子串的原长度
                        tmp = dp[j];
            dp[i] = tmp + 1;//比较完成,加上自身
        }
        ans = -1;
        for(i = 1; i <= N; i++)
            if(ans < dp[i])
                ans = dp[i];
        pf(ans);
        return 0;
    }
    View Code

     思路2:http://jijiwaiwai163.blog.163.com/blog/static/1862962112011427101823753/

    最简单的解法()

    思路3:

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <algorithm>
     5 #define sc(x) scanf("%d",&(x))
     6 #define pf(x) printf("%d
    ", x)
     7 #define CL(x, y) memset(x, y, sizeof(x))
     8 #define max(a, b) (a > b ? a : b)
     9 using namespace std;
    10 const int MAX = 1005;
    11 int dp[MAX], arr[MAX];
    12 int N;
    13 int main()
    14 {
    15     int i, j;
    16     sc(N);
    17     for (i = 0; i < N; ++i)
    18         sc(arr[i]);
    19     fill(&dp[0], &dp[N], 1);//同memset
    20     for (i = 0; i < N; ++i)
    21     {
    22         //dp[i] = 1;
    23         for (j = 0; j < i; ++j)
    24             if (arr[j] < arr[i]) dp[i] = max(dp[j] + 1, dp[i]);
    25     }
    26     pf(*max_element(&dp[0], &dp[N]));//输出最大值
    27     return 0;
    28 }
    View Code

    其中运用algorithm中的函数

  • 相关阅读:
    Chrome应用商店打不开解决方法
    vue中的列表项删除操作
    markdown(语法)入门学习:
    利用插件(jQuery-ui.js)实现表格行的拖拽排序
    div拖拽互换位置(vue)
    MarkDown学习
    经典算法精讲精练之回溯法求解0-1背包问题
    读书笔记——《谁说菜鸟不会数据分析—Python篇》
    读书笔记之《统计之美:人工智能时代的科学思维》
    读书笔记之《漫画算法:小灰的算法之旅》
  • 原文地址:https://www.cnblogs.com/ghostTao/p/4299741.html
Copyright © 2011-2022 走看看