解题思路
- 引入神经网络概念:
- 激活函数之一:
ReLU(x)
\[ReLU(x)=\begin{cases}0\ (x\leq0)\\x\ (x>0)\end{cases}\iff ReLU(x)=\max(x,0)
\]
- 假设状态 \(dp(i)\) 为:
- 当前 \(i\) 个元素,恰好选择了第 \(i\) 个元素,
- 所组成的,最大连续子区间和的答案
转移方程
\[dp[x]=nums[i]+ReLU(dp[x-1])
\]
- 也就是说,只要前一项满足 \(dp[x-1]\) 非负
- 即可成为一个被激活的状态,使得原先的连续区间延长
- 否则,相当于就此断开,重新开始一个新区间累加
代码
class Solution {
public:
int ReLU(int&x){
return max(x,0);
}
int maxSubArray(vector<int>& nums) {
vector<int>dp(nums.size(),0);
dp[0]=nums[0];
for(int i=1;i<nums.size();i++)
dp[i]=nums[i]+ReLU(dp[i-1]);
return *max_element(begin(dp),end(dp));
}
};