标签:
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
标签:
原文地址:http://www.cnblogs.com/tyx0604/p/4299741.html