题面:
题目翻译:
农夫约翰有N头牛,编号分别为1到N.每头牛有不同的能力水平.第i头牛的能力水平为si.农夫要把这些牛分成若干组.每一组都由编号连续的总数不大于K的牛组成.
因为牛有学习能力,所以分组之后,组内的所有牛的能力水平都相当于组内最高的牛的能力水平.
分组后的总能力水平最高能达到多少?
题目分析:
这个题目可以用dp来做.
对于第i头牛,找出它于前1到k头牛组队的最大值.
公式大概是:
F[i] = max( F[i-k] + (?) * k , F[i-(k+1)] + (?) * (k-1) , … , F[i] + (?) * 0 )
其中i为第i头牛时的答案
?为第i-k+1到第i头牛之间的最大能力水平.
最后输出F[N].
代码:
#include<stdio.h>
int n, k;
int cows[10010], ans[10010];
int main(){
scanf("%d%d", &n, &k);
for(int i = 1; i <= n; ++i){
scanf("%d", cows+i);
}
for(int i = 1 ;i <= n; ++i){
ans[i] = cows[i];
int max = cows[i];
for(int j = 1; i-j+1 > 0 && j <= k; ++j){
if(ans[i] < ans[i-j] + j*max){
ans[i] = ans[i-j] + j*max;
}
if(max < cows[i-j]){
max = cows[i-j];
}
}
}
printf("%d", ans[n]);
}