当前位置:网站首页>USACO3.4 “破锣摇滚”乐队 Raucous Rockers - DP
USACO3.4 “破锣摇滚”乐队 Raucous Rockers - DP
2022-07-05 20:08:00 【小酒窝.】
https://www.luogu.com.cn/problem/P2736
题意
给定 N ( 1 ≤ N ≤ 20 ) N(1\leq N\leq 20) N(1≤N≤20) 首歌,从中选出若干首歌曲,发行 M ( 1 ≤ M ≤ 20 ) M(1\leq M\leq 20) M(1≤M≤20) 张 CD。
每张 CD 最多容纳 T ( 1 ≤ T ≤ 20 ) T(1\leq T\leq 20) T(1≤T≤20) 分钟的音乐,一首歌不能分装在两张 CD 中。CD 数量可以用完,也可以不用完。
根据以下标准进行选择:
- 歌曲必须按照创作的时间顺序在所有的 CD 盘上出现。(注:第 i i i 张盘的最后一首的创作时间要早于第 i + 1 i+1 i+1 张盘的第一首)
- 选中的歌曲数目尽可能地多。
问,能够装进 M M M 张 CD 的最多歌曲数量?
思路
“歌曲必须按照创作的时间顺序在所有的 CD 盘上出现” 这个条件说明不能直接贪心。
考虑用dp,当前容量中最多能够存储的歌曲数量从减掉当前歌曲大小的容量来转移。
而 “一首歌不能分装在两张 CD 中” 这个条件就说明不能简单的从上一个容量来转移,还需要考虑是否分装在两张中。
所以,定义状态 f[i, j, k]
表示,对于前 i
首歌曲,用前 j
张 CD 外加 k
分钟,能够容纳的最多歌曲数量。
那么最终的状态就为 f[n, m, 0]
。
状态转移:
- 首先继承上一位置的状态:
f[i, j, k] = f[i-1, j, k]
; - 当外加的
k
分钟大于当前歌曲大小时,就可以从f[i-1, j, k-a[i]
来转移:f[i, j, k] = f[i-1, j, k-a[i]] + 1
; - 否则,就需要存储在上一张唱片中,从
f[i-1, j-1, t-a[i]]
来转移:f[i, j, k] = f[i-1, j-1, t-a[i]] + 1
;
Code
#include<bits/stdc++.h>
using namespace std;
const int N = 210, mod = 1e9+7;
int T, n, m;
int a[N];
int f[N][N][N];
signed main(){
int t;
cin >> n >> t >> m;
for(int i=1;i<=n;i++) cin >> a[i];
for(int i=1;i<=n;i++){
for(int j=0;j<=m;j++){
for(int k=0;k<=t;k++)
{
f[i][j][k] = f[i-1][j][k];
if(k>=a[i]) f[i][j][k] = max(f[i][j][k], f[i-1][j][k-a[i]] + 1);
else if(t-a[i] >= 0 && j >= 1) f[i][j][k] = max(f[i][j][k], f[i-1][j-1][t-a[i]] + 1);
}
}
}
cout << f[n][m][0];
return 0;
}
经验
状态定义要敢想。
边栏推荐
- 【数字IC验证快速入门】8、数字IC中的典型电路及其对应的Verilog描述方法
- Some problems encountered in cocos2d-x project summary
- Four methods of random number generation | random | math | threadlocalrandom | securityrandom
- Database logic processing function
- 期货如何网上开户?安不安全?
- DP:树DP
- 常用运算符与运算符优先级
- A solution to PHP's inability to convert strings into JSON
- Is it safe to open a mobile stock account? Is it reliable?
- 字节跳动Dev Better技术沙龙成功举办,携手华泰分享Web研发效能提升经验
猜你喜欢
Hong Kong stocks will welcome the "best ten yuan store". Can famous creative products break through through the IPO?
95后阿里P7晒出工资单:狠补了这个,真香...
.Net分布式事务及落地解决方案
.Net分布式事務及落地解决方案
计算lnx的一种方式
Android interview classic, 2022 Android interview written examination summary
Redis cluster simulated message queue
实操演示:产研团队如何高效构建需求工作流?
Leetcode brush question: binary tree 13 (the same tree)
Scala基础【HelloWorld代码解析,变量和标识符】
随机推荐
JS implementation prohibits web page zooming (ctrl+ mouse, +, - zooming effective pro test)
Float.floatToRawIntBits的返回值具体意思,将float转为byte数组
- Oui. Net Distributed Transaction and Landing Solution
Leetcode brush questions: binary tree 11 (balanced binary tree)
浮动元素与父级、兄弟盒子的关系
港股将迎“最牛十元店“,名创优品能借IPO突围?
微信小程序正则表达式提取链接
Leetcode skimming: binary tree 16 (path sum)
Relationship between floating elements and parent and brother boxes
函数的概念及语法
使用 RepositoryProvider简化父子组件的传值
【数字IC验证快速入门】3、数字IC设计全流程介绍
Debezium series: idea integrates lexical and grammatical analysis ANTLR, and check the DDL, DML and other statements supported by debezium
Is it safe to open a mobile stock account? Is it reliable?
Leetcode brush question: binary tree 14 (sum of left leaves)
leetcode刷题:二叉树10(完全二叉树的节点个数)
【数字IC验证快速入门】6、Questasim 快速上手使用(以全加器设计与验证为例)
95后阿里P7晒出工资单:狠补了这个,真香...
How to retrieve the root password of MySQL if you forget it
C langue OJ obtenir PE, ACM démarrer OJ