经典DP-最大子数组

连续子数组的最大和

代码

//定义一个名为"连续子数组的最大和"的公共类  
public class 连续子数组的最大和 {  

 // 定义一个静态变量maxn,并赋值为100010  
 static int maxn=100010;  

 // 定义一个静态的整数数组dp,大小为maxn  
 static int[] dp=new int[maxn];  

 // 定义一个公共方法maxSubArray,它接受一个整数数组nums作为参数  
 public int maxSubArray(int[] nums) {  
     // 初始化maxValue为nums数组的第一个元素  
     int maxValue = nums[0];  

     // 初始化dp数组的第一个元素为nums数组的第一个元素  
     dp[0] = nums[0];  

     // 使用for循环遍历nums数组,从第二个元素开始(索引为1)  
     for(int i=1; i<nums.length; i++) {  
         // 将dp数组的当前位置初始化为nums数组的当前元素  
         dp[i] = nums[i];  

         // 如果dp数组的前一个位置的值大于0,则将dp数组的前一个位置的值加到当前位置  
         if(dp[i-1]>0) {  
             dp[i] += dp[i-1];  
         }  

         // 更新maxValue,如果dp数组的当前位置的值大于maxValue,则更新maxValue  
         maxValue = Math.max(maxValue, dp[i]);  
     }  

     // 返回maxValue,即最大子数组的和  
     return maxValue;  
 }  

 // 主方法,程序的入口点  
 public static void main(String[] args) {  
     // 创建一个"连续子数组的最大和"类的实例  
     连续子数组的最大和 solution = new 连续子数组的最大和();  

     // 定义并初始化一个测试用的整数数组nums  
     int[] nums= {-2,1,-3,4,-1,2,1,-5,4};  

     // 调用solution对象的maxSubArray方法,并将结果存储在result变量中  
     int result = solution.maxSubArray(nums);  

     // 打印result的值到控制台  
     System.out.println(result);  
 }  
}

详解

  1. 变量定义:

    • maxn=100010: 这是一个静态变量,用于定义数组 dp 的大小。这个值可能是为了确保 dp 数组足够大,以容纳可能的所有情况,但在此特定问题中,这个大小可能是过度的。通常,为了简化,你可以直接使用输入数组 nums 的长度作为 dp 的大小。
    • dp[]: 这是一个动态规划数组,用于存储从数组开始到当前位置的最大子数组和。
  2. maxSubArray 方法:

    • 这个方法接受一个整数数组 nums 作为输入,并返回最大子数组的和。
    • maxValue 是用来存储当前找到的最大子数组和。开始时,它被初始化为 nums[0],因为第一个元素自身就是一个子数组。
    • dp[0] 被初始化为 nums[0],表示从数组开始到第一个元素的最大子数组和。
    • 使用一个循环遍历 nums 数组。在每一步中,都会更新 dp[i] 的值:
      • 首先,dp[i] 被初始化为 nums[i],表示当前元素自身作为一个子数组的和。
      • 然后,检查 dp[i-1](即从数组开始到前一个元素的最大子数组和)是否大于0。如果是,那么将 dp[i-1] 加到 dp[i] 上,表示将当前元素与前一个最大子数组结合起来可能会得到一个更大的子数组和。
      • 使用 Math.max(maxValue, dp[i]) 更新 maxValue,确保它始终存储最大的子数组和。
    • 循环结束后,返回 maxValue
  3. main 方法:

    • 这是一个标准的Java主方法,用于测试 maxSubArray 方法。
    • 创建一个 连续子数组的最大和 类的实例 solution
    • 定义一个测试数组 nums
    • 调用 solution 的 maxSubArray 方法,并将结果存储在 result 中。
    • 打印 result

当你运行这个程序时,它会输出 6,这是数组 {-2,1,-3,4,-1,2,1,-5,4} 中最大子数组的和(子数组为 {4,-1,2,1})。

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值