leetcode-动态规划之最大子序列和

一:题目描述

leetcode-动态规划之最大子序列和_第1张图片

二:题目分析(重点)

dp[i]记录以nums[i]为子序列末端的最大序子列连续和

那么状态转移方程为:dp[i]=max{dp[i-1]+nums[i],nums[i]},时间复杂度为n

注意不要与dp[i]=max{dp[i-1]+nums[i],dp[i-1]}相混乱.此方程求得的为可以为不连续的元素最大和,也就是简单的数组元素的最大和.

请务必思考这一点.

三:测试通过代码

法一:动态规划(重点)

int maxSubArray(vector& nums) {
      int max = nums[0];
    	int n=nums.size();
    	int dp[n];
    	dp[0]=nums[0];  
		  	
        for(int i = 1; i < n; i++) {
            if(dp[i-1]+nums[i]>=nums[i]){
            	dp[i]=nums[i]+dp[i-1];
			}
			else{
					dp[i]=nums[i];
			}
			if(dp[i]>max)
			max=dp[i];
        }
        
        return max; 
    }

法二:暴力求解

int maxSubArray(vector& nums) {
      int max = nums[0];
    	int n=nums.size();
        for(int i = 0; i < n; i++) {
            int mul = 0;
            
            for(int j = i; j < n; j++) {
                mul += nums[j];
                
                if(mul > max) {//直接在循环内部作比较,而不用算出所有再比较 
                    max = mul;//更新最大值 
                }
            }
        }
        
        return max;  
    }

leetcode-动态规划之最大子序列和_第2张图片

你可能感兴趣的:(ACM刷题)