
牛客算法入门课练习赛2 : 牛牛的旅游纪念品
发布日期:2021-05-07 07:56:16
浏览次数:29
分类:原创文章
本文共 741 字,大约阅读时间需要 2 分钟。
牛牛的旅游纪念品
题解:这个题如果没有对位置的限制,就可以贪心取前m大的数即可。
但本题的关键在于买的m个物品中任意两个的位置差都大于等于k。那么贪心的方法显而易见行不通,很容易联想到用动态规划取搞。那么它的状态如何表示?状态转移方程怎么写?
由题可知本题有两个状态,n个物品以及取走m个物品,并且对物品的位置有着限制,那么我们可以定义
dp[i][j]:前j个物品取i个的欢迎程度
dp[i][j]无非由两种状态转移而来
- 没有买第j个物品,那么dp[i][j]=dp[i][j-1]。
- 买了第j个物品,那么此时dp[i][j]=dp[i-1][j-k]+a[j]。
很容易得到状态转移 方程:dp[i][j]=max(dp[i][j-1],dp[i-1][j-k]+a[j])。
初始状态就是在取第一个时,dp[1][j]=max(dp[1][j-1],a[j])。
int a[maxn];int dp[maxm][maxn];int main(){ int n,m,k; cin >> n >> m >> k; for(int i=1;i<=n;i++) cin >> a[i]; for(int i=0;i<maxm;i++) for(int j=0;j<maxn;j++) dp[i][j]=-inf; for(int i=1;i<=n;i++) dp[1][i]=max(dp[1][i-1],a[i]); for(int i=2;i<=m;i++) { for(int j=k+1;j<=n;j++) dp[i][j]=max(dp[i][j-1],dp[i-1][j-k]+a[j]); } cout << dp[m][n] << endl;}
发表评论
最新留言
网站不错 人气很旺了 加油
[***.192.178.218]2025年04月02日 23时03分07秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
基于vue2.0实现仿百度前端分页效果(二)
2019-03-06
JS魔法堂:函数重载 之 获取变量的数据类型
2019-03-06
时间序列神器之争:Prophet VS LSTM
2019-03-06
SpringBoot中关于Mybatis使用的三个问题
2019-03-06
MapReduce实验
2019-03-06
Leaflet 带箭头轨迹以及沿轨迹带方向的动态marker
2019-03-06
java大数据最全课程学习笔记(1)--Hadoop简介和安装及伪分布式
2019-03-06
java大数据最全课程学习笔记(2)--Hadoop完全分布式运行模式
2019-03-06
还在使用集合类完成这些功能?不妨来看看 Guava 集合类!!!
2019-03-06
大部分程序员还不知道的 Servelt3 异步请求,原来这么简单?
2019-03-06
[apue] popen/pclose 疑点解惑
2019-03-06
[apue] getopt 可能重排参数
2019-03-06
移动互联网恶意软件命名及分类
2019-03-06
adb shell am 的用法
2019-03-06
PySide图形界面开发(一)
2019-03-06
Android如果有一个任意写入的漏洞,如何将写权限转成执行权限
2019-03-06
三角网格体积计算
2019-03-06
现代3D图形编程学习-基础简介(2) (译)
2019-03-06
Github教程(3)
2019-03-06
vue实现简单的点击切换颜色
2019-03-06