当前位置:网站首页>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;
}
经验
状态定义要敢想。
边栏推荐
- [C language] merge sort
- 怎么挑选好的外盘平台,安全正规的?
- Leetcode skimming: binary tree 16 (path sum)
- Leetcode brush question: binary tree 13 (the same tree)
- Elk distributed log analysis system deployment (Huawei cloud)
- Go language learning tutorial (16)
- Guidelines for application of Shenzhen green and low carbon industry support plan in 2023
- 函数的概念及语法
- Leetcode brush questions: binary tree 11 (balanced binary tree)
- 14. Users, groups, and permissions (14)
猜你喜欢

Base du réseau neuronal de convolution d'apprentissage profond (CNN)

S7-200smart uses V90 Modbus communication control library to control the specific methods and steps of V90 servo
Complete interview questions for interviewers and senior Android engineers in front-line Internet enterprises

ACM getting started Day1

Database logic processing function

Debezium series: record the messages parsed by debezium and the solutions after the MariaDB database deletes multiple temporary tables

leetcode刷题:二叉树16(路径总和)

【数字IC验证快速入门】9、Verilog RTL设计必会的有限状态机(FSM)

Go language | 02 for loop and the use of common functions

Recommended collection, my Tencent Android interview experience sharing
随机推荐
How to select the Block Editor? Impression notes verse, notation, flowus
Is it safe to open a mobile stock account? Is it reliable?
DP: tree DP
Common operators and operator priority
Debezium series: record the messages parsed by debezium and the solutions after the MariaDB database deletes multiple temporary tables
Debezium series: modify the source code to support UNIX_ timestamp() as DEFAULT value
中金财富在网上开户安全吗?
leetcode刷题:二叉树17(从中序与后序遍历序列构造二叉树)
leetcode刷题:二叉树12(二叉树的所有路径)
走入并行的世界
id选择器和类选择器的区别
Recommended collection, my Tencent Android interview experience sharing
After 95, Alibaba P7 published the payroll: it's really fragrant to make up this
leetcode刷题:二叉树15(找树左下角的值)
Relationship between floating elements and parent and brother boxes
港股将迎“最牛十元店“,名创优品能借IPO突围?
Database logic processing function
深度学习 卷积神经网络(CNN)基础
【c语言】快速排序的三种实现以及优化细节
Float. The specific meaning of the return value of floattorawintbits is to convert float into byte array