53.最大サブシーケンス合計(単純)

アイデア:

そして、最も長く増加するサブシーケンス最も長いパリンドロームシーケンスの古典的な例は類似しており、それらは動的計画法です

状態遷移方程式:

dp [i]は、現在の数の前の最大のサブシーケンスの合計を表します

1)dp [i-1]が正の数の場合は、nums [i]を直接追加します。dp[i] = dp [i-1] + nums [i]

2)dp [i-1]が負の数の場合、dp [i]はnums [i]のみを取ります。これは、新しいサブシーケンスを再選択することと同じです。

最终dp [i] = Math.max(dp [i-1] + nums [i]、nums [i])

 

コード1:

class Solution {
    public int maxSubArray(int[] nums) {
	int n=nums.length;
	int[] dp=new int[n+1];
		
	dp[0]=nums[0];
	for(int i=1;i<n;i++){
	    dp[i]=Math.max(nums[i],dp[i-1]+nums[i]);
	}
		
	int res=dp[0];
	for(int i=1;i<n;i++){
	    res=Math.max(res,dp[i]);
	}
	return res;
    }
}

 

壊す:

1)これは2番目のタイプのdpであり、現在の値は以前に計算されたすべての値に依存します

属している線形計画

 

2)2つのサイクルが使用され、1つのサイクルに組み合わせることができます

int res=dp[0];
for(int i=1;i<n;i++){
    dp[i]=Math.max(nums[i],nums[i]+dp[i-1]);
    res=Math.max(res,dp[i]);
}

 

3)最後の状態をここに直接返すことはできません(dp [n-1])。

出力があるべきすべて dp[0]dp[1]......、dp[n - 1] 通読、いずれか大きい方

同じ状況が「レグオ」質問300にも当てはまります。最長の昇順部分列です。

おすすめ

転載: blog.csdn.net/di_ko/article/details/115260814