求连续子数组的最大和---2017滴滴笔试编程1


#include "stdio.h"
#include"stdlib.h"
#include"iostream"
#include <limits.h>
#include"vector"
using namespace std;
/*
求连续子数组最大和。--动态规划思想

假设dp[i]表示以数组A第i个元素结尾的连续子数组和最大
  dp[0]=A[0]
  dp[1]=max(A[1],A[1]+dp[0])
  dp[2]=max(A[2],A[2]+dp[1])
  dp[3]=max(A[3],A[3]+dp[2])
  ...
  d[n-1]=max(A[n-1],A[n-1]+dp[n-2])

  最后取max(dp[0],dp[1],...dp[n-1])即可
*/

int maxSubArray_DP(int* A, size_t szA,int &maxSum)//int &maxSum 这是一个引用,表示maxSum和main中的output同属执行一个地址的变量
{
    vector<int> dp(szA);//用C++容器可实现变量指定容器大小
    maxSum=INT_MIN;
    int pos=0;
    for(int i=0;i<szA;i++)//数组个数
    {
        if(i==0)
            dp[0]=A[0];
        else
            dp[i]=max(A[i],A[i]+dp[i-1]);
	
	//-------------------11111-------------方式1-------------
         // msa = max(msa,r[i]);
        //若以A[i]结尾的子数组更大,则更新最大子数组的值,并且记录结尾元素的位置i;
    /*    if(maxSum<dp[i])
        {
            maxSum = dp[i];
            pos = i;
        }*/
   //-------------------------------------------------
    }

	//---------------------2222----------------方式2---------
	for(int i=0;i<szA;i++){
	  if(dp[i]>maxSum){
		  maxSum=dp[i];
		  pos=i;
	  }
	}
   //-------------------------------------------------------------
    return pos;
}

int main()
{
    int N;
    cin>>N;
    int *A = new int[N];
    for(int i=0;i<N;i++){
        cin>>A[i];

    }

    int output=0;
    maxSubArray_DP(A, N, output);

    cout<<output;

    return 0;
}



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值