学习网上某位朋友的做法。
基本思想:b(i,j) = Max{ b(i, j-1) + e[j], Max{ b(i-1, t) } + e[j] } (i <= t < j)
再做优化:存放在两个一维数组中:
#include<stdio.h>
#include<stdlib.h>
int maxsum(int e[], int n, int m)
{
int *curr_best;
int *prev_best;
int max_sum, i, j;
curr_best = (int*)malloc(sizeof(int) * (n + 1));/分配,不初始化
prev_best = (int*)calloc(n + 1, sizeof(int));//分配,且每个元素初始化为0
*curr_best = 0;
e--;
for(i = 1; i <= m; ++i)
{
max_sum = -2147483648;
for(j = i; j <= n; ++j)
{
if(curr_best[j - 1] < prev_best[j - 1])//prev_best中存放的是i-1阶段的最大值
curr_best[j] = prev_best[j - 1] + e[j];
else
curr_best[j] = curr_best[j - 1] + e[j];
prev_best[j - 1] = max_sum;
if(max_sum < curr_best[j])
max_sum = curr_best[j];//prev_best中存放i阶段的最大值
}
prev_best[j - 1] = max_sum;//对第n个数赋值
}
free(prev_best);
free(curr_best);
return max_sum;
}
int main()
{
int i,n,m;
int *data;
while(scanf("%d %d",&m,&n)==2&&n>0&&m>0)
{
data=(int *)malloc(sizeof(int)*n);
for(i=0;i<n;i++)
scanf("%d",&data[i]);
printf("%d\n",maxsum(data,n,m));
free(data);
}
return 0;
}
#include<stdlib.h>
int maxsum(int e[], int n, int m)
{
int *curr_best;
int *prev_best;
int max_sum, i, j;
curr_best = (int*)malloc(sizeof(int) * (n + 1));/分配,不初始化
prev_best = (int*)calloc(n + 1, sizeof(int));//分配,且每个元素初始化为0
*curr_best = 0;
e--;
for(i = 1; i <= m; ++i)
{
max_sum = -2147483648;
for(j = i; j <= n; ++j)
{
if(curr_best[j - 1] < prev_best[j - 1])//prev_best中存放的是i-1阶段的最大值
curr_best[j] = prev_best[j - 1] + e[j];
else
curr_best[j] = curr_best[j - 1] + e[j];
prev_best[j - 1] = max_sum;
if(max_sum < curr_best[j])
max_sum = curr_best[j];//prev_best中存放i阶段的最大值
}
prev_best[j - 1] = max_sum;//对第n个数赋值
}
free(prev_best);
free(curr_best);
return max_sum;
}
int main()
{
int i,n,m;
int *data;
while(scanf("%d %d",&m,&n)==2&&n>0&&m>0)
{
data=(int *)malloc(sizeof(int)*n);
for(i=0;i<n;i++)
scanf("%d",&data[i]);
printf("%d\n",maxsum(data,n,m));
free(data);
}
return 0;
}
学会的是0x80000000表示的数为最小负整数,等于-2147483648
malloc与calloc的用法与区别。
错了很多次,还是错,现在不想再做这题了。。(上面程序是对的)。
以后什么时候翻起来的时候再做吧。