アイデア:
そして、最も長く増加するサブシーケンスと最も長いパリンドロームシーケンスの古典的な例は類似しており、それらは動的計画法です
状態遷移方程式:
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にも当てはまります。最長の昇順部分列です。