题意:

音符格式转换成长度最小且字典序最小的格式。一共有777种音节,分别是R1R1R1、R2R2R2、R4R4R4、R8R8R8、R16R16R16、R32R32R32、R64R64R64,分别表示1、12\frac{1}{2}21​、14\frac{1}{4}41​、18\frac{1}{8}81​、116\frac{1}{16}161​、132\frac{1}{32}321​、164\frac{1}{64}641​ 拍。对于R1R2R1R2R1R2即为32\frac{3}{2}23​拍,也可以表示成R1.R1.R1.。即可将相邻的一个音节化为‘.’,因此R2...R2...R2...表示R2R4R16R32R2R4R16R32R2R4R16R32。

此题给出一个音符表示格式,要求转化为长度最短且字典序最小的方式。

例如 R1R4R16R1R4R16R1R4R16 转化为 R16R1R4R16R1R4R16R1R4 。


思路:

比赛的时候遇到这题,错误地当成了贪心问题进行考虑,导致始终无法AC。

现在我们来观察这个问题,这个表达式所有音节的拍数相加之和是不变的,而每一个音节单元的拍数和长度也都是确定的,因此等价于一个完全背包问题。

因此如果此题没有要求给出一个字典序最小的方案,只要求最短长度的话。dp[i]dp[i]dp[i]表示音符表达式拍数为iii所需的最短长度,然后直接跑一个完全背包即可。

但是这题还要求求出长度最小时字典序最小,因此我们需要考虑状态方程。我一开始的错误做法是两维forforfor循环,第一维枚举用到了第iii个音节单元,第二维枚举当前拍数jjj,然后在转移时若是小于,直接转移,若是等于,则比较当前音节单元字典序与dp[j]的最后一个音节单元字典序。这样会wawawa,因为无法保证字典序最小。

但是如果换一种枚举方式就可以通过此题,第一维forforfor循环枚举音节拍数iii,第二维枚举使用了第jjj个音节单元,然后 ====== 部分的转移仍比较当前jjj与dp[i]dp[i]dp[i]的上一个音节单元字典序即可通过此题。原因在于求取dp[i]dp[i]dp[i]的时候,已经使用了所有的音节单元,而前一种枚举方式并没有用上所有的音节单元所以导致出错。

当然此题也可以字典序倒序枚举前iii个音节单元,也可以通过此题。

处理完这部分之后,就是完全背包的路径输出了,由于完全背包dp[i][j]dp[i][j]dp[i][j]是由dp[i][j−w[i]]dp[i][j-w[i]]dp[i][j−w[i]]转移而来,即同维转移而来,因此不需要不需要010101背包的二维记录路径,直接使用一维进行路径记录,即上一次由哪个音节单元转移而来即可。


总结:

此题考查了完全背包的两个内容,一是完全背包求取过程中加上了对于字典序最小的求解,二是完全背包的一维路径输出。


代码:

#include <cstdio>
#include <iostream>
#include <cstring>
#include <string>
#include <bitset>
#include <algorithm>
#define __ ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)
#define rep(i,a,b) for(int i = a; i <= b; i++)
#define LOG1(x1,x2) cout << x1 << ": " << x2 << endl;
#define LOG2(x1,x2,y1,y2) cout << x1 << ": " << x2 << " , " << y1 << ": " << y2 << endl;
#define LOG3(x1,x2,y1,y2,z1,z2) cout << x1 << ": " << x2 << " , " << y1 << ": " << y2 << " , " << z1 << ": " << z2 << endl;
typedef long long ll;
typedef double db;
const int N = 3200000+10;
const int M = 1e5+100;
const db EPS = 1e-9;
using namespace std;char s[N];
int len,n,tot,dp[N],pre[N],ttp[N];
// int str[N][33];
// string str[N];
//v: 拍数, w: 长度
//len: 总拍数
//用最少的长度凑满总拍数
//dp[i]: 表示凑满拍数为i所需的最少长度struct Node{int num,sum,ctt,v,w; //num: 编号,sum: .个数,ctt: 选了多少个, v: 拍数, w: 字符长度string ss;bool operator < (Node xx) const {if(num == xx.num) return sum > xx.sum; else return (ss < xx.ss);}
}ans[30];void solve()
{memset(dp,0x3f,sizeof dp);dp[0] = 0;rep(j,1,len) //音符长度rep(i,1,tot){ //枚举所有音符单元if(j >= ans[i].v){if(dp[j] > dp[j-ans[i].v]+ans[i].w){dp[j] = dp[j-ans[i].v]+ans[i].w;pre[j] = i;}else if(dp[j] == dp[j-ans[i].v]+ans[i].w){if(pre[j] > i){ //之前的字典序更大dp[j] = dp[j-ans[i].v]+ans[i].w;pre[j] = i;      }}}}int tp = len;while(tp > 0){ //完全背包一维记录路径, 直接回溯ans[pre[tp]].ctt++;tp = tp-ans[pre[tp]].v;}rep(i,1,tot)rep(j,1,ans[i].ctt)cout << ans[i].ss;cout << endl;
}int main()
{// freopen("e.in","r",stdin);// freopen("e.out","w",stdout);scanf("%s",s+1); n = strlen(s+1);int num;//获取拍数总长度rep(i,1,n){num = 0;if(s[i] == 'R'){i++;while(s[i] != 'R' && i <= n && s[i] != '.'){num = num*10+s[i]-'0';i++;}}int tt = 64/num;// LOG2("i",i,"tt",tt);len += tt;if(s[i] == '.'){while(s[i] != 'R' && i <= n){tt /= 2;len += tt;i++;}}i--;}//构造所有音符单元rep(i,1,7){rep(j,0,i-1){int tp = 1<<(i-1);++tot;ans[tot].v += tp;rep(k,1,j){tp /= 2, ans[tot].v += tp;}ans[tot].w = j+1;if(i <= 3) ans[tot].w += 2;else ans[tot].w += 1;ans[tot].sum = j;ans[tot].num = 1<<(7-i);}}rep(i,1,tot){ans[i].ss = "\0";string tpp;tpp += 'R';tpp += to_string(ans[i].num);rep(j,1,ans[i].sum) tpp += ".";ans[i].ss = tpp;}sort(ans+1,ans+1+tot);//按字典序构造音符单元 —— 非关键操作, 也可直接打表输入Node tp = ans[7];rep(i,8,10) ans[i-1] = ans[i];ans[10] = tp;// rep(i,1,tot)// LOG3("i",i,"ss",ans[i].ss,"v",ans[i].v);solve();return 0;
}

【Gym-100837E】Optimal Rest【完全背包】相关推荐

  1. codeforce Gym 101102A Coins (01背包变形)

    01背包变形,注意dp过程的时候就需要取膜,否则会出错. 代码如下: #include<iostream> #include<cstdio> #include<cstri ...

  2. Gym 100917J---Judgement(01背包+bitset)

    题目链接 http://codeforces.com/gym/100917/problem/J Description standard input/output Statements The jur ...

  3. Gym - 100502G Outing (强连通缩点+树形依赖背包)

    题目链接 问题:有n个人,最多选k个,如果选了某个人就必须选他指定的另一个人,问最多能选多少个人. 将每个人所指定的人向他连一条单向边,则每一个点都有唯一的前驱,形成的图是个基环树森林,在同一个强连通 ...

  4. GYM 100694A - Did he drop any good loot? (DP,背包)

    题意 类似背包的一道题,n件物品,主人公最大承重m,但是可以选择激活两个物品增加自己的力量.每个物品都有价值p.重量w.激活后可增加的承重d三个属性,求最大价值. 解题思路 三维dp,第一维表示当前到 ...

  5. Gym - 103055J - Grammy and Jewelry ( dijkstra + 完全背包 )

    题目链接:点击进入 题目 题意 存在一个有 n 个顶点和 m 条边的连通无向图.顶点的索引范围为 1 到 n .在顶点 i( 2 <= i <=n )中有无限的珠宝 ,每个都有价值的 ai ...

  6. 强化学习(三) - Gym库介绍和使用,Markov决策程序实例,动态规划决策实例

    强化学习(三) - Gym库介绍和使用,Markov决策程序实例,动态规划决策实例 1. 引言 在这个部分补充之前马尔科夫决策和动态规划部分的代码.在以后的内容我会把相关代码都附到相关内容的后面.本部 ...

  7. 强化学习(一)——专业术语及OpenAI Gym介绍

    强化学习(一)--专业术语及OpenAI Gym介绍 1. 专业术语 1.1 Agent(智能体) 1.2 Environment(环境) 1.3 State *s*(状态) 1.4 Action * ...

  8. python完全背包最优_python 完全背包问题_遗传算法Python实战 009.背包问题

    原标题:遗传算法Python实战 009.背包问题 写在前面的话 以下部分内容,来自百度 背包问题(Knapsack problem)是一种组合优化的NP完全问题.问题可以描述为:给定一组物品,每种物 ...

  9. POJ 3628 Bookshelf 2 (01背包)

    Bookshelf 2 Time Limit: 1000MS   Memory Limit: 65536K Description Farmer John recently bought anothe ...

  10. 基于动态背包的多场景广告序列投放算法

    简介:电商广告是广告主接触其目标用户的重要手段.普遍的广告目标是在预算约束下,在一定时间范围内最大化广告主累计收入.实际应用中,广告的转化通常需要对同一用户进行多次曝光,直到该用户最终购买为止.但是, ...

最新文章

  1. Linux Kernel TCP/IP Stack — L1 Layer — 多队列网卡
  2. [导入].net分布式事务例子
  3. getwayworker timer_Java定时器之Timer学习二
  4. 学习全球最火编程语言Python,要读哪些书?
  5. 前端开发学习之——dom ready和window onload的区别
  6. 【ROS系统】解决找不到用户工作空间下的程序包的问题——E:No such package
  7. uniapp微信小程序获取位置(高德SDK)
  8. ORACLE数据库 基础练习表EMP\DEPT \SALGRADE脚本
  9. 用python 开发合同管理系统_python3.6+django2.0 一小时学会开发一套学员管理系统demo...
  10. 网易新闻 鸿蒙,本报记者体验华为首款鸿蒙产品
  11. 语言中出现蘌ress_语言障碍、语言异常及语言发育迟缓的异同
  12. Java中解密微信加密数据工具类
  13. 经典论文之OverFeat
  14. 图普科技李麟|当新零售遇上人工智能
  15. 多因子模型的前世今生
  16. W74 - 999、云计算工程师认证
  17. 仿照源码,手写一个自定义 Spring MVC 框架
  18. 服务器时间 验证码不显示,时间不同步导致网页验证码不能正常显示解决方法...
  19. 尝试用Unity还原蔚蓝(Celeste)—— 真·操控、移动、手感篇
  20. linux三剑客-sed命令的学习笔记

热门文章

  1. 使用DPM2007来保护企业数据
  2. 飞利浦 f718 java 微信_第一次使用飞利浦F718手机感觉怎么样及优缺点
  3. python在同一行输入n个数转义符_python:转义符\
  4. Spring和Mybatis整合-mapper开发
  5. word中填充效果锁定纵横比_操作基础知识Word文字编辑
  6. kafka应用场景_从未如此简单:10分钟带你逆袭Kafka!
  7. 1041 Be Unique (20 分) 水题
  8. php header带session,PHP接口跨域header头以及Session跨域方法
  9. python 根据关键字 切割pdf_用python拆分pdf
  10. 【POJ3335】Rotating Scoreboard(多边形的内核-----半平面交+特殊情况)