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 }
思路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; }
思路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 }
其中运用algorithm中的函数