Description
Input
Output
Sample Input
7 1 7 3 5 9 4 8
Sample Output
4
是求出上升(递增)序列的个数,所以如果第i项代表当前子序列的终点,那么要满足前j项(1<=j<=i-1)每一项都要小于第i项,再对j作为终点分解;最终状态就是,一个数的最长上升子序列就是自己,个数为1;两个的话如果不是递增就是自己,是递增则为终点+前一项的个数;
所以状态为:
1~n : dp[i] = 1 ;
1~i-1 : if(a[i]>a[j]) dp[i] = max (dp[i] , dp[j] + 1 ) ;
得到的dp[i] 就是所有子序列的最大值,挨个比较即可;
AC代码:
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std ; int dp[2000] ,a[2000]; int main() { int n ; while(cin>>n) { memset(dp,0,sizeof(dp)); memset(a,0,sizeof(a)); if(n==0) printf("1\n"); else { for(int i = 1 ; i<=n ; i++) { cin>>a[i]; } int maxi = -999999 ; for(int i = 1 ; i<=n; i++) { dp[i] = 1 ; //*第i项为终点至少有1个; for(int j = 1 ; j <= i -1 ; j++) { if(a[i]>a[j]) { dp[i] = max(dp[i] , dp[j] + 1 ); } } } for(int i = 1 ; i <= n ; i++) { if(dp[i]>maxi) maxi = dp[i]; } cout << maxi <<endl; } } return 0 ; }