题目1:有一个int型数组Num,里面存放着若干的正数和负数,请你设计一个算法,在数组中截取一段Num[start]--Num[end],使得这一段的整数之和最大,并返回最大值max。 // findMaxPart.cpp : Defines the entry point for the console application. // #include "stdafx.h" #define max(x,y) ((x)>(y))?(x):(y) /************************************************************************/ /* 有一个int型数组Num,里面存放着若干的正数和负数,请你设计一个算法, 在数组中截取一段Num[start]--Num[end],使得这一段的整数之和最大,并返回最大值max。 思路:动态规划,假设从A[1..N-1]的最大的一段之和为All[1],包含A[1]的和最大的一段时Start[1] ,则A[0..n-1]的结果为max{A[0],A[0]+Start[1],All[1]}; */ /************************************************************************/ int findMaxPart(int *num,int n){ int nAll=*(num+n-1);//最后的一个数 int nStart=*(num+n-1);//从 int index=0; for (index=n-2;index>=0;index--) { nStart=max(*(num+index),*(num+index)+nStart); nAll=max(nStart,nAll); } return nAll; } int findMaxPart1(int *num,int n){ int nAll=*(num+n-1);//最后的一个数 int nStart=*(num+n-1);//从 int index=0; for (index=n-2;index>=0;index--) { if(nStart<0) nStart=0; nStart+=*(num+index); if(nStart>nAll) nAll=nStart; } return nAll; } int findMaxPart2(int *num,int n){ int nCurNum=0; int nGreatestSum=0; int i; for (i=0;i<n;i++) { nCurNum+=*(num+i); if (nCurNum<0) { nCurNum=0; } if (nCurNum>nGreatestSum) { nGreatestSum=nCurNum; } } if (nGreatestSum==0) { nGreatestSum=*(num+0); for (i=1;i<n;i++) { if (*(num+i)>nGreatestSum) { nGreatestSum=*(num+i); } } } return nGreatestSum; } int main(int argc, char* argv[]) { int num[]={-9,-2,-3,-5,-3}; int max=findMaxPart2(num,sizeof(num)/sizeof(*num)); printf("max:%d/n",max); return 0; }