Teamwork 题解

题面:

在这里插入图片描述

题目翻译:

农夫约翰有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]);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值