题目描述:
(这个送分题,其实就两种情况,你选还是不选,选比不选好就选,不选比选好就不选,我像是在说废话)
选的情况是相加,不选的情况就是连续中断,值为自己,那么直接和自己比较就ok了
状态公式如下
i从1开始的
dp[i] = (dp[i-1] + nums[i-1]) > nums[i-1] ? (dp[i-1] + nums[i-1]) : nums[i-1]
错误示范:我一开始仿佛失了智,不选的时候我理所应当填了个0,dp[i] = (dp[i-1] + nums[i-1]) > 0 ? (dp[i-1] + nums[i-1]) : 0,结果被case干了:
我思考了一下,还有负数这一说,而且中断连接至少应该拿起自己吧,然后灰溜溜的改了代码:
class Solution {
public:
int maxSubArray(vector<int>& nums) {
//动态规划
//(这个送分题,其实就两种情况,你选还是不选,选比不选好就选,不选比选好就不选,我像是在说废话)
//选的情况是相加,不选的情况就是连续中断,值为自己,那么直接和自己比较就ok了
//状态公式如下
//i从1开始的
//dp[i] = (dp[i-1] + nums[i-1]) > nums[i-1] ? (dp[i-1] + nums[i-1]) : nums[i-1]
int len = nums.size();
int dp[len + 5];
int result = -1000000;
memset(dp, 0, sizeof(dp));
//只有一个负数的情况
if(len == 1) return nums[0];
for(int i = 1; i <= len; i++){
dp[i] = (dp[i-1] + nums[i-1]) > nums[i-1] ? (dp[i-1] + nums[i-1]) : nums[i-1];
if(dp[i] > result) result = dp[i];
}
return result;
}
};