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

本文共 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

你可能感兴趣的文章
SQL Server编程系列(1):SMO介绍
查看>>
在VMware网络测试“专用VLAN”功能
查看>>
使用Formik轻松开发更高质量的React表单(三)<Formik />解析
查看>>
也问腾讯:你把用户放在什么位置?
查看>>
CSS Sprites 样式生成工具(bg2css)
查看>>
[转]如何重构代码--重构计划
查看>>
类中如何对list泛型做访问器??
查看>>
C++解析XML--使用CMarkup类解析XML
查看>>
P2P应用层组播
查看>>
Sharepoint学习笔记—修改SharePoint的Timeouts (Execution Timeout)
查看>>
CSS引入的方式有哪些? link和@import的区别?
查看>>
Redis 介绍2——常见基本类型
查看>>
asp.net开发mysql注意事项
查看>>
(转)Cortex-M3 (NXP LPC1788)之EEPROM存储器
查看>>
ubuntu set defult jdk
查看>>
[译]ECMAScript.next:TC39 2012年9月会议总结
查看>>
【Xcode】编辑与调试
查看>>
用tar和split将文件分包压缩
查看>>
[BTS] Could not find stored procedure 'mp_sap_check_tid'
查看>>
PLSQL DBMS_DDL.ALTER_COMPILE
查看>>