码迷,mamicode.com
首页 > 其他好文 > 详细

POJ2533 最长上升子序列

时间:2015-02-25 17:00:25      阅读:114      评论:0      收藏:0      [点我收藏+]

标签:

 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 }

令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{1, 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] = 1

POJ2533 最长上升子序列

标签:

原文地址:http://www.cnblogs.com/tyx0604/p/4299741.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!