一、题目描述
给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组是数组中的一个连续部分。
C++程序要求输入输出格式如下:
输入:
5
5 4 -1 7 8
输出:23
二、思路
根据动态规划解题步骤:
- 确定dp数组的含义
dp[i]表示以下标i结尾的数组nums的最长连续子序列和为dp[i] - 确定递推公式
dp[i]只有两个方向可以推出来:
dp[i - 1] + nums[i],即:nums[i]加入当前连续子序列和nums[i],即:从头开始计算当前连续子序列和一定是取最大的,所以dp[i] = max(dp[i - 1] + nums[i], nums[i]); - dp数组初始化
dp[i]依赖于之前的dp[i-1],因此dp[0]是基础,dp[0]=nums[0]。 - 确定遍历顺序
dp[i]依赖于之前的dp[i-1],因此是从前往后进行遍历。
三、C++代码
#include<bits/stdc++.h>
using namespace std;
//最大子序和
#define maxn 10010
int dp[maxn]; //dp[i]表示以下标i结尾的数组nums的最长连续子序列和为dp[i]
int nums[maxn];
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++){
cin>>nums[i];
}
//dp数组初始化
dp[0]=nums[0];
int result=dp[0];
//确定dp数组的递推公式
for(int i=1;i<n;i++){
dp[i]=max(dp[i-1]+nums[i],nums[i]);
if(dp[i]>result){
result=dp[i];
}
}
cout<<result;
}