博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
牛客假日团队赛1 J.分组
阅读量:5919 次
发布时间:2019-06-19

本文共 1068 字,大约阅读时间需要 3 分钟。

链接:

题意:

在Farmer John最喜欢的节日里,他想要给他的朋友们赠送一些礼物。由于他并不擅长包装礼物,他想要获得他的奶牛们的帮助。你可能能够想到,奶牛们本身也不是很擅长包装礼物,而Farmer John即将得到这一教训。

Farmer John的N头奶牛(1≤N≤10^4)排成一行,方便起见依次编号为1…N。奶牛i的包装礼物的技能水平为si。她们的技能水平可能参差不齐,所以FJ决定把她的奶牛们分成小组。每一组可以包含任意不超过K头的连续的奶牛(1≤K≤10^3),并且一头奶牛不能属于多于一个小组。由于奶牛们会互相学习,这一组中每一头奶牛的技能水平会变成这一组中水平最高的奶牛的技能水平。

请帮助FJ求出,在他合理地安排分组的情况下,可以达到的技能水平之和的最大值。

思路:

dp[i]表示从1-i再满足条件情况下的最大值。从第一个找到最后一个。

每次从当前位置找最多k个,令dp[i]取到最大,假设j是从i开始往前的某个位置。
dp[i] = max(dp[i], dp[i-(i-j+1)]+mmax*(i-j+1))。
mmax是从i到j中最大的值。

代码:

#include 
using namespace std;typedef long long LL;const int MAXN = 1e4 + 10;const int MOD = 1e9 + 7;int n, m, k, t;int a[MAXN];int dp[MAXN];int main(){ //freopen("test.in", "r", stdin); cin >> n >> k; for (int i = 1;i <= n;i++) cin >> a[i]; for (int i = 1;i <= n;i++) { int mmax = -1; for (int j = i;j >= 1 && j > i-k;j--) { mmax = max(mmax, a[j]); dp[i] = max(dp[i], dp[i-(i-j+1)]+mmax*(i-j+1)); } } cout << dp[n] << endl; return 0;}

转载于:https://www.cnblogs.com/YDDDD/p/10997104.html

你可能感兴趣的文章
Linux主机如何用ssh去登录docker容器的步骤
查看>>
几种常用常看的知识点
查看>>
小知识点总结
查看>>
PHP合并数组+与array_merge的区别
查看>>
外键约束的参照操作(十八)
查看>>
IIS服务中五种身份验证的灵活运用
查看>>
可汗学院超经典、超实用概率论总结——商女不知忘国恨,隔江犹看概率论
查看>>
linux命令(36):vimdiff文件对比
查看>>
Spring 4 支持的 Java 8 特性
查看>>
Office HPDeskjetD2468 打印机电源灯闪烁不停,打印机不工作怎么办
查看>>
jQuery插件开发的两种方法及$.fn.extend的详解(转)
查看>>
[转]Entity Framework Refresh context?
查看>>
leetCode 53: Maximum Subarray
查看>>
红皮书:变量、作用域和内存问题(四)
查看>>
合并两个有序数组
查看>>
HDFS Federation
查看>>
10-02 Java 形式参数和返回值的问题深入研究,链式编程
查看>>
Ubuntu下安装Solr
查看>>
Docker基于已有的镜像制新的镜像-Docker for Web Developers(3)
查看>>
jvm内存模型-回收算法-和内存分配以及jdk、jre、jvm是什么关系(阿里,美团,京东面试题)...
查看>>