その最大戻るを有する(サブアレイが最小要素を含む)NUMSに整数の配列を与えられ、そして連続するサブ配列の最大値を見つけます。
例:
入力:[-2,1、-3,4、-1,2,1、-5,4]、
出力:6
説明:連続サブアレイ[4、-1,2,1]であり、最大値は6でした。
出典:滞在ボタン(LeetCode)
リンク:https://leetcode-cn.com/problems/maximum-subarray
アイデア:私は1得ることができる前に、意思決定は3種類あり、最終的にこれを見つけたので、一般的なダイナミックプログラミングの問題が、初めて初めて、間違った考えのために私はF [i]は、最大数の組み合わせを表し、連続した条件が満たされず、右fとすべきである[I] Iの数の終わりに最大値、および意思決定を示す2つだけです。
不正行為
class Solution {
public:
int maxSubArray(vector<int>& nums) {
if(!nums.size())return 0;
vector<int> f(nums.size());
//base case
f[0]=nums[0];
//dp
for(int j=1;j<nums.size();++j){
f[j]=max(nums[j],max(f[j-1],f[j-1]+nums[j]));
cout<<f[j]<<endl;
}
return f[nums.size()-1];
}
};
正しいアプローチ
class Solution {
public:
int maxSubArray(vector<int>& nums) {
if(!nums.size())return 0;
//f[i]表示以第i个数结尾的所有连续数组的最大值
vector<int> f(nums.size());
//base case
f[0]=nums[0];
//dp
int ans=f[0];
for(int i=1;i<nums.size();++i)
f[i]=max(f[i-1]+nums[i],nums[i]),ans=max(ans,f[i]);
return ans;
}
};