Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 35502 | Accepted: 15572 |
Description
Input
Output
Sample Input
7 1 7 3 5 9 4 8
Sample Output
4
题意:求最长上升子序列。
思路:令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
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <iostream> #include <algorithm> #include <set> #include <queue> using namespace std; const int inf=0x3f3f3f3f; int dp[1010]; int a[1010]; int main() { int n,i,j; int maxx; int cnt=1; while(~scanf("%d",&n)){ maxx=-inf; for(i=1;i<=n;i++) scanf("%d",&a[i]); for(i=1;i<=n;i++){ dp[i]=1; for(j=1;j<i;j++){ if(a[j]<a[i]&&dp[i]<dp[j]+1) dp[i]=dp[j]+1; } maxx=max(dp[i],maxx); } printf("%d\n",maxx); } return 0; }
POJ 2533-Longest Ordered Subsequence(dp_最长上升子序列)
原文:http://blog.csdn.net/u013486414/article/details/43415309