很常见的面试题目了,有两种方法:
一、观察规律,因为是寻找连续最大和,需要遍历整个数组,用一个变量来记录所有连续和中最大的,用另一个变量来记录遍历过程中最大的。如果遍历过程中最大的变为0了,则说明后面的元素要重新计算最大值了。因为和之前统计的加上不会再增大。
二、动态规划法。状态为f(i)表示以数组第i个位置结尾的连续最大和,状态方程为:如果f(i-1)小于等于0,则f(i)取当前位置的值,否则f(i) = f(i-1)+value[i]。(value[i]表示数组i位置的值)。
详细见代码。
#include<iostream>
using namespace std;
//按规律
void continuousmax(int *number,int len){
if(number == NULL || len <0){
printf("输入出错\n");
return;
}
int cursum =0;
int maxsum =0x80000000;
for(int i = 0;i<len;i++){
if(cursum <=0)
cursum = number[i];
else
cursum += number[i];
if(cursum > maxsum)
maxsum = cursum;
}
printf("方法一找到的最大连续值是%d\n",maxsum);
}
//按动态规划
void dpmaxsum(int *number,int len){
if(number == NULL || len <0){
printf("输入出错\n");
return;
}
int *dp = (int *)malloc(sizeof(int)*len);
dp[0] = number[0];
int maxsum = dp[0];
for(int i=1;i<len;i++){
if(dp[i-1]<=0)
dp[i] = number[i];
else
dp[i] = number[i]+dp[i-1];
if(dp[i]>maxsum)
maxsum = dp[i];
}
printf("方法二找到的最大连续值是%d\n",maxsum);
}
int main(){
int x,numbers[100];
int len =0;
scanf("%d",&x);
while(x != -1){
numbers[len++] = x;
scanf("%d",&x);
}
continuousmax(numbers,len-1);
dpmaxsum(numbers,len-1);
system("PAUSE");
return 0;
}