1. 程式人生 > >A - 最長上升子序列

A - 最長上升子序列

A - 最長上升子序列

Time Limit: 1000/1000MS (C++/Others) Memory Limit: 65536/65536KB (C++/Others)

Problem Description

一個數的序列bi,當b1 < b2 < ... < bS的時候,我們稱這個序列是上升的。對於給定的一個序列(a1, a2, ..., aN),我們可以得到一些上升的子序列(ai1, ai2, ..., aiK),這裡1 <= i1 < i2 < ... <iK <= N。比如,對於序列(1, 7, 3, 5, 9, 4, 8),有它的一些上升子序列,如(1, 7), (3, 4, 8)等等。這些子序列中最長的長度是4,比如子序列(1, 3, 5, 8)。

你的任務,就是對於給定的序列,求出最長上升子序列的長度。

Input

輸入有很多組,每組輸入的第一行是序列的長度N (1 <= N <= 1000)。第二行給出序列中的N個整數,這些整數的取值範圍都在010000

Output

輸出每組的最長上升子序列的長度。

Sample Input

7
1 7 3 5 9 4 8
6
2 3 4 1 6 5

Sample Output

4
4
#include<cstdio>

int
a[1005]; // 題目資料是1000的,開陣列儘量開大一丟丟 int dp[1005]; // 用於記錄以當前位結尾的LIS最大值 int main(){ int n; scanf("%d", &n); for(int i=0; i<n; i++){ // 儲存在陣列中 下標[0, n) scanf("%d", &a[i]); } for(int i=0; i<n; i++){ dp[i] = 1; // 因為以當前位為結尾的LIS最短是本身,所以可以初始化為1 for
(int j=0; j<i; j++){ // 此處當a[j] < a[i]時,表示第i位數字可以加在第j位後面 // 當第i位載入第j位後面,所形成的LIS長度為dp[j]+1 // 當dp[j]>=dp[i]時,更新dp[i] if(a[j] < a[i] && dp[j] >= dp[i]){ dp[i] = dp[j] + 1; } } } // 至此 我們處理出了 以任意位為結尾所得到的LIS最長為多少,只需要遍歷找到最大的那個即可 int ans = 0; for(int i=0; i<n; i++){ if(dp[i] > ans){ ans = dp[i]; } } printf("%d\n", ans); return 0; }