ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

团队合作

2020-01-12 11:53:07  阅读:275  来源: 互联网

标签:10 奶牛 合作 max 水平 maxn 团队 技能


一道很水的dp题

题目描述:

在 Farmer John 最喜欢的节日里,他想要给他的朋友们赠送一些礼物。由于他并不擅长包装礼物,他想要获得他的奶牛们的帮助。你可能能够想到,奶牛们本身也不是很擅长包装礼物,而 Farmer John 即将得到这一教训。
Farmer John 的 N 头奶牛(1≤N≤10^4)排成一行,方便起见依次编号为 1…N。奶牛 ii 的包装礼物的技能水平为 si​。她们的技能水平可能参差不齐,所以 FJ 决定把她的奶牛们分成小组。每一组可以包含任意不超过 K 头的连续的奶牛(1≤K≤10^3),并且一头奶牛不能属于多于一个小组。由于奶牛们会互相学习,这一组中每一头奶牛的技能水平会变成这一组中水平最高的奶牛的技能水平。
请帮助 FJ 求出,在他合理地安排分组的情况下,可以达到的技能水平之和的最大值。

样例:

输入:输入的第一行包含 N 和 K。                            输出:输出 FJ 通过将连续的奶牛进行分组可以达到的最大技能水平和。

以下 N 行按照 N 头奶牛的排列顺序依次给出她们的技能水平。                84

技能水平是一个不超过 10^5 的正整数。

7 3
1
15
7
9
2
5
10

思路:

显然,这是一道dp,数据较小,n≤10^4,O(n²)可以过。

于是我们设f[i]为从1到i最大的技术水平和,j为从i到i-j+1位一组,

maxn为s[1]到s[i]最大的技术水平。

转移同时max当前s[i]和maxn;

自然而然地想到转移方程

f[i]=max(f[i],f[i-(i-j+1)]+maxn*(i-j+1));

不需要优化和卡常(水)

但我在考场上没想到是一道dp,以为是贪心。

代码

#include<cstdio>
#include<iostream>
using namespace std;
int n,k,s[10100],f[10100];
int main() {
//    freopen("teamwork.in","r",stdin);
//    freopen("teamwork.out","w",stdout);
    scanf("%d%d",&n,&k);
    for(int i=1; i<=n; ++i)
        scanf("%d",&s[i]);
    for (int i=1; i<=n; ++i) {
        int maxn=-1;
        for (int j=i; j>=1&&j>i-k; --j) {
            maxn=max(maxn,s[j]);
            f[i]=max(f[i],f[i-(i-j+1)]+maxn*(i-j+1));
        }
    }
    printf("%d",f[n]);
}

标签:10,奶牛,合作,max,水平,maxn,团队,技能
来源: https://www.cnblogs.com/ouzijun-OJ/p/12182238.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有