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\n", 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\n", 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\n", 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中的函数

posted @ 2015-02-25 16:09  PastLIFE  阅读(132)  评论(0编辑  收藏  举报