题目
题解
设
为在选取第
个数字的情况下,将前
个数字分成
组的最大收益。则转移方程式为:
- 压缩空间复杂度 由转移式可以看出, 的值只与 和 有关,所以可以使用滚动数组进行空间压缩。
- 降低时间复杂度 使用 来记录 ,边求解 ,边记录。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define maxn 1000005
#define inf 0x3f3f3f3f
int s[maxn], f[maxn], pre[maxn];
int n, m, pre_max;
int _max(int a, int b){
return a > b ? a : b;
}
int main()
{
int i, j;
while(~scanf("%d%d", &m, &n)){
for(i = 1; i <= n; i++){
scanf("%d", &s[i]);
}
for(i = 0; i <= n; i++){f[i] = 0;pre[i] = 0;}
for(i = 1; i <= m; i++){
pre_max = -inf;
for(j = i; j <= n; j++){
f[j] = _max(f[j - 1], pre[j - 1]) + s[j];
pre[j - 1] = pre_max;
pre_max= _max(pre_max, f[j]);
}
pre[j - 1] = pre_max;
}
printf("%d\n", pre_max);
}
return 0;
}