动规五部曲
dp[i] 含义为:下标为 i 的数组的最大子数组和dp[i-1]+nums[i] 和 nums[i] 两者中取一个较大的dp[i] = Math.max(dp[i-1]+nums[i],nums[i]);dp[0] = nums[0]i = 0 遍历到 n-1
class Solution {
public int maxSubArray(int[] nums) {
// 1. 定义 dp数组
//
int[] dp = new int[nums.length];
// 2.递推公式
// dp[i] = Math.max(dp[i-1]+nums[i],nums[i]);
// 3.初始化
dp[0] = nums[0];
// 4. 遍历顺序
for(int i = 1 ; i < nums.length;i++){
dp[i] = Math.max(dp[i-1]+nums[i],nums[i]);
}
int res = nums[0];
for(int i:dp){
res = Math.max(res,i);
}
return res;
}
}
public class maxSubNums {
// 求 最大子数组和
public static int maxSub(int[] nums){
// 1.dp数组
int[] dp = new int[nums.length];
// 2.递推公式
// dp[i] = Math.max(dp[i-1]+nums[i],nums[i]);
// 3.初始化
dp[0] = nums[0];
// 4.遍历顺序
int res = nums[0];
for(int i = 1 ; i < nums.length;i++){
dp[i] = Math.max(dp[i-1]+nums[i],nums[i]);
res = Math.max(res,dp[i]);
}
return res;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("输入数组的长度");
int n = sc.nextInt();
int[] nums = new int[n];
for(int i = 0 ; i < n;i++){
nums[i] = sc.nextInt();
}
System.out.println("最大子数组和为"+maxSub(nums));
}
}