题面:

传送门

B. Teamwork

Input file: standard input
Output file: standard output
Time limit: 1 second
Memory limit: 256 megabytes
 
For his favorite holiday, Farmer John wants to send presents to his friends. Since he isn’t very good at wrapping presents, he wants to enlist the help of his cows. As you might expect, cows are not much better at wrapping presents themselves, a lesson Farmer John is about to learn the hard way. Farmer John’s N cows (1 ≤ N ≤ 10^4) are all standing in a row, conveniently numbered 1...N in order. Cow i has skill level si at wrapping presents. These skill levels might vary quite a bit, so FJ decides to combine his cows into teams. A team can consist of any consecutive set of up to K cows (1 ≤ K ≤ 10^3), and no cow can be part of more than one team. Since cows learn from each-other, the skill level of each cow on a team can be replaced by the skill level of the most-skilled cow on that team. Please help FJ determine the highest possible sum of skill levels he can achieve by optimally forming teams.
 
Input
The first line of input contains N and K. The next N lines contain the skill levels of the N cows in the order in which they are standing. Each skill level is a positive integer at most 105.
 
Output
Please print the highest possible sum of skill levels FJ can achieve by grouping appropriate consecutive sets of cows into teams.
 
Example
Input
7 3
1
15
7
9
2
5
10
Output
84
 
Note
In this example, the optimal solution is to group the first three cows and the last three cows, leaving the middle cow on a team by itself (remember that it is fine to have teams of size less than K). This effectively boosts the skill levels of the 7 cows to 15, 15, 15, 9, 10, 10, 10, which sums to 84.
 

题目描述:

有n头奶牛,我们可以让连续的奶牛组成一队,组队后队里所有奶牛的等级就会变成队里等级最高的那个,求n头奶牛经过组队后,所有奶牛的等级之和最大的是多少。一队奶牛的数量最多不超过C头牛。
 

题目分析:

这道题可以用动态规划解决:我们先重新定义这个问题:求前n头牛的等级之和最大值是多少?再看看这个问题的子问题:前i头牛的等级之和最大值是多少?(1 <= i <= n)会想到如何联系子问题和我们要求的题目问的问题,其实就是:我已经知道前i头牛的等级之和最大值是多少,然后通过这个计算出前n头牛的等级之和最大值是多少。然后,我们可以定义一个dp[i]数组来记录前i头牛的等级之和最大值,来通过利用dp[i]的值算出dp[n]。
 
我们具体看看样例怎样算:首先,我们已经知道dp[i](1 <= i <= 6)的值,求dp[7]。我们对最后一头牛,也就是第7头牛进行分类讨论:
 
1.第7头奶牛自己组成一队,那么,dp[7] = dp[6] + 10
 
 
2.第7头奶牛和前面的一头奶牛组成一队,那么,dp[7] = dp[5] + 10 * 2
 
 
3.第7头奶牛和前面的两头奶牛组成一队,那么,dp[7] = dp[4] + 10 * 3

然后选出最大的那种情况就可以了。
那么,dp[4], dp[5], dp[6]怎么求?我们可以用求dp[7]的方法同样求出这三个的值。
状态转移方程:dp[i] = max{ dp[i-j] + j * max level[k] ( i-j+1 <= k <= i ) }   
 
 
AC代码:
 
 1 #include <cstdio>
2 #include <cstring>
3 #include <iostream>
4 #include <cmath>
5 #include <algorithm>
6 using namespace std;
7 const int maxn = 1e4+5;
8 const int maxk = 1e3+5;
9 int n, k;
10 int a[maxn];
11 int dp[maxn];
12
13 void test(){
14 cout << endl;
15 for(int i = 1; i <= n; i++){
16 printf("dp[%d] = %d\n", i, dp[i]);
17 }
18 }
19
20 int main(){
21 scanf("%d%d", &n, &k);
22 for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
23
24
25 for(int i = 1; i <= n; i++){
26 int pre_max = 0;
27 for(int j = 1; j <= k; j++){
28 if(i >= j){
29 if(a[i-j+1] > pre_max) pre_max = a[i-j+1];
30 dp[i] = max(dp[i], dp[i-j]+pre_max*j);
31 }
32 }
33 }
34
35 //test();
36 printf("%d\n", dp[n]);
37 return 0;
38 }
 
 

2019 GDUT Rating Contest I : Problem B. Teamwork的更多相关文章

  1. 2019 GDUT Rating Contest II : Problem F. Teleportation

    题面: Problem F. Teleportation Input file: standard input Output file: standard output Time limit: 15 se ...

  2. 2019 GDUT Rating Contest III : Problem D. Lemonade Line

    题面: D. Lemonade Line Input file: standard input Output file: standard output Time limit: 1 second Memo ...

  3. 2019 GDUT Rating Contest I : Problem H. Mixing Milk

    题面: H. Mixing Milk Input file: standard input Output file: standard output Time limit: 1 second Memory ...

  4. 2019 GDUT Rating Contest I : Problem A. The Bucket List

    题面: A. The Bucket List Input file: standard input Output file: standard output Time limit: 1 second Me ...

  5. 2019 GDUT Rating Contest I : Problem G. Back and Forth

    题面: G. Back and Forth Input file: standard input Output file: standard output Time limit: 1 second Mem ...

  6. 2019 GDUT Rating Contest III : Problem E. Family Tree

    题面: E. Family Tree Input file: standard input Output file: standard output Time limit: 1 second Memory ...

  7. 2019 GDUT Rating Contest III : Problem C. Team Tic Tac Toe

    题面: C. Team Tic Tac Toe Input file: standard input Output file: standard output Time limit: 1 second M ...

  8. 2019 GDUT Rating Contest III : Problem A. Out of Sorts

    题面: 传送门 A. Out of Sorts Input file: standard input Output file: standard output Time limit: 1 second M ...

  9. 2019 GDUT Rating Contest II : Problem G. Snow Boots

    题面: G. Snow Boots Input file: standard input Output file: standard output Time limit: 1 second Memory ...

随机推荐

  1. Win10 Nodejs搭建http-server注意点

    下载安装,并用命令行查看版本:如果提示输入命令找不到等,可能是没有安装成功,或者是环境变量引起的: 如果在提示安装不成功可能是win10权限问题,最好使用管理员模式运行cmd,再用cmd命令打开安装文 ...

  2. nodejs非安装版配置(windows)

    nodejs官网下载地址: https://nodejs.org/en/download/ 解压到本地并配置环境变量 在环境变量path中新增 D:\develop\node 查看是否配置成功 至此n ...

  3. LaTex公式在线转图片

    Reference https://latex.codecogs.com/gif.latex?THE_FORMULAR 注: 请不要包含空格 或者 将整段url放到浏览器里, 会产生空格等字符的替换, ...

  4. js 十大排序算法 All In One

    js 十大排序算法 All In One 快速排序 归并排序 选择排序 插入排序 冒泡排序 希尔排序 桶排序 堆排序(二叉树排序) 基数排序 计数排序 堆排序(二叉树排序) https://www.c ...

  5. css3 & content & attr & data-*

    css3 & content & attr & data-* content: attr(data-value); https://github.com/oliviale/CS ...

  6. svg opacity & fill-opacity & stroke-opacity

    svg opacity & fill-opacity & stroke-opacity opacity = ill-opacity + stroke-opacity https://s ...

  7. uniapp 发起网络请求

    推荐下我写的uni-http 创建http-config.js import Vue from 'vue' const BASE_URL = 'http://xxx.com'; if (process ...

  8. [报错集]ubuntu中安装oracle java报错

    1.因为版本更新,JAVA15以前的版本都已经没办法下载了,所以要使用oracle java必须使用最近的java15 $ sudo apt-get install oracle-java15-ins ...

  9. http接口的学习(暂时只是记录,测试之后重新更新)

    链接1:https://blog.csdn.net/java173842219/article/details/54020168 链接2:https://blog.csdn.net/u01132074 ...

  10. 微信小程序:block标签

    代码中存在block标签,但是渲染的时候会移除掉. 例子: 如果将view改为block: 当你要渲染某些数据时,如果不想额外的加一层外边的标签,此时可以使用block标签来进行占位.