標籤:i++ int() tin 面試 length next 規劃 int 問題
---恢複內容開始---
動態規劃求數組中最長的上升序列(LongestIncreasingSubsequence)的個數,複雜度為O(n^2)。
例如:數組int arr[] = {7,3,5,9,4,6,8,10},最長上升序列應該為3,5,6,8,10或3,4,6,8,10 ,最終答案應該為5;
dp[i]表示數組中以下標i結尾的最長上升序列的個數,則原問題就轉換為了求所有dp[i](0<=i<len)中的最大值;
而每一個dp[i]又是以下標i結尾的所有序列中最長上升序列的個數。
import java.util.Scanner;
public class Main
{
public static void main(String[] args) throws Exception
{
Scanner sc = new Scanner(System.in);
while(sc.hasNext())
{
int n = sc.nextInt();
int[] arr = new int[n];
for(int i= 0;i<n;i++)
{
arr[i] = sc.nextInt();
}
System.out.println(maxLIS(arr));
}
}
public static int maxLIS(int[] arr)
{
int max = 1;
int len = arr.length;
int[] dp = new int[len];
dp[0] = 1;
for(int i=1;i<len;i++)
{
for(int j =0;j<i;j++)
{
if(arr[i]>arr[j])
dp[i] = Math.max(dp[i],dp[j]+1);
}
max = Math.max(dp[i],max);
}
return max;
}
}
---恢複內容結束---
面試基礎演算法題