Java実装 - 最も長いシーケンス上昇

この問題は、暴力がそれを解決する場合は、すべての数は、選択したかではない二つの状態を選択した後、その順序が増加するかどうかを判断し、もしそうなら、あなたはすべてのケースを列挙するまで、最長の長さを更新した、動的なプログラミングの問題です。しかし、明らかに耐え難いある複雑さO(2 ^ n)を、到達するn個の要素が存在する場合。

したがって、動的プログラミングを使用することは、著しく複雑さを低減することができます。

立ち上がり配列の最長の長さの終わりに[I]で表さ順序DP [I]、[I]のための二つの可能性が存在しています。

1)より[i]は少数[J](Jよりも存在する場合、I <I)、およびDP [J] + 1> DPの前に [I]( すなわち、A [i]は[Jを配置します(現在は、長さaよりも大きくされているシーケンスの終了後に[i]の配列の端部の長さ)、次いで配列の[J]最後までPUT前後[I]を入れ、そして長さ+を作ります即ちDP [I] DP = [J] + 1);
2)それ以前[i]は、すべての大より場合は、のみ[i]はサブシーケンス自体として、その長さは1です。

public class Solution {
    /**
     * @param nums: The integer array
     * @return: The length of LIS (longest increasing subsequence)
     */
    public int longestIncreasingSubsequence(int[] nums) {
        // write your code here
        if(nums.length==0){
			return 0;
		}
		int dp[]=new int[nums.length];
		for(int i=0;i<nums.length;i++){
			dp[i]=1;
			for(int j=0;j<i;j++){
				if(nums[i]>nums[j]&&dp[j]+1>dp[i])
					dp[i]=dp[j]+1;
			}
		}
		int max=Integer.MIN_VALUE;
		for(int i=0;i<nums.length;i++){
			max=Math.max(max, dp[i]);
		}
		return max;
    }
}


公開された254元の記事 ウォン称賛23 ビュー50000 +

おすすめ

転載: blog.csdn.net/qq_30242987/article/details/104721054