題目如下 :
在一個子串中任意取N項,要求這N項是遞增的,求出這個串中這樣的N的最大值,注意這樣的最長子列不一定是唯一的,例如在 2 1 5 3 6 4 6 3 中就有1 3 4 6 和2 3 4 6兩種,都是4。
本題可以這麼考慮,可以從頭開始往後求,設置一個一維數dp組來保存以每一項爲結尾的最長子列數目,第一項的肯定是1,後面的第i項只要往前掃描,假如第j項值比我第i項的值小或者等於第i項,那麼以第i項爲結尾的最長子列數目就是max(dp[i],dp[j]+1),一直這麼求直到最後一項n,那麼整個串中最長上升子列數目就是dp[n]了,
所以代碼如下:
import java.util.*;
public class LIStest {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] datas = new int[n];
int[] max = new int[n];
int result = 0;
for(int i=0;i<n;i++){
datas[i] = sc.nextInt();
max[i] = 1;
}
for(int i=0;i<n;i++){
for(int j=0;j<i;j++){
if(datas[j]<=datas[i]){
max[i] = max(max[i],max[j]+1);
}
}
result = max(result,max[i]);
}
System.out.print(result);
}
public static int max(int a,int b){
if(a>b){
return a;
}else{
return b;
}
}
}
結果如下 :