题目
剑指 Offer 42. 连续子数组的最大和
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
dp[i] = dp[i-1] + dp[i-2]
解答
注:c++解答
class Solution {
public:
int maxSubArray(vector<int>& nums) {
if(nums.empty()) return 0;
if(nums.size()==1) return nums[0];
vector<int> dp;
dp.reserve(nums.size());
dp[0]=nums[0];
int max=dp[0];
int i;
for(i=1;i<nums.size();i++)
{
if(dp[i-1]<=0)
{
dp[i]=nums[i];
}
else
{dp[i]=dp[i-1]+nums[i];}
if(dp[i]>max)
{
max=dp[i];
}
}
return max;
}
};
状态方程定义:
设动态规划列表dp,dp[i]代表以元素nums[i]为结尾的连续子数组最大和
动态规划:
状态转移方程:dp[i] = max(dp[i-1] + nums[i], nums[i]),其中dp[i]表示以索引i为结束点基准的子数组的最大值。
初始状态:dp[0]= nums[0]。