这道题目个人认为应该用随机算法多次模拟最后求平均这样的方法来做,这里面有两个问题,一个是模拟的数组应该是开多大,而是测试用例要弄多少次,测试用例的次数当然是越多越好,而数组里面元素的个数直接影响最后的期望值,大概1个元素期望是0--1的期望,然后期望和元素个数应该是个线性的关系。如果我的程序有什么错误之处,还请大家赐教!
#include<stdio.h>
#include<limits.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<time.h>
#define MAX_NUM 10000
#define TEST_CASE 10000
#define GET_MAX(x,y) ((x)>(y)?(x):(y))
double list[MAX_NUM];
void produce_random(double *arr,int );
double max_sum(double *arr,int n);
int
main(void)
{
int test = 0;
double aver_max_sum = 0;
double sum = 0;
while(test<TEST_CASE){
test++;
produce_random(list,MAX_NUM);
sum+=max_sum(list,MAX_NUM);
}
printf("respected max_sum is %f\n",sum/TEST_CASE);
return EXIT_SUCCESS;
}
void produce_random(double *arr,int n){
srand((unsigned int )time(NULL));
int i = 0;
while(n--)
{
arr[i++] = (random()%20001 - 10000)/10000.0;
}
}
double max_sum(double *arr,int n){
double sum = 0,max_sum = 0;
int i;
for(i = 0;i<n;i++)
{
sum = GET_MAX(sum+arr[i],0);
max_sum = GET_MAX(max_sum,sum);
}
return max_sum;
}