到达型01背包---P1877 [HAOI2012]音量调节
P1877 [HAOI2012]音量调节
题解
solution 1 普通dfs 60pt
dfs 暴搜,pos 记录当前到了第几首歌,level 记录当前的音量
一个小剪枝
由于每换一首歌都要调节音量,也就是要么 + 下一首音量,要么 - 下一首歌音量。那么当我们发现无论是上调音量还是下降音量都不能满足 [ 0,maxlevel ] 的音量区间,那么直接 return 掉就好了,也就是我们只转移合法的音量
ans 记录答案,可以初始化 -1 ,不合法的答案输出 -1
但是普通dfs会TLE啊
60 pt code
//60 pt dfs
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<string>
#include<cstring>
#include<queue> using namespace std; typedef long long ll; inline int read()
{
int ans=;
char last=' ',ch=getchar();
while(ch<''||ch>'') last=ch,ch=getchar();
while(ch>=''&&ch<='') ans=ans*+ch-'',ch=getchar();
if(last=='-') ans=-ans;
return ans;
} int n,star,maxl;
int a[];
int ans=-; void dfs(int pos,int level)
{
if(pos>n){ans=max(ans,level);return;}
if(level+a[pos]>maxl&&level-a[pos]<) return;
if(level+a[pos]<=maxl&&level+a[pos]>=) dfs(pos+,level+a[pos]);
if(level-a[pos]<=maxl&&level-a[pos]>=) dfs(pos+,level-a[pos]);
} int main()
{
n=read();star=read();maxl=read();
for(int i=;i<=n;i++) a[i]=read();
dfs(,star);
printf("%d\n",ans); return ;
}
solution 2 记忆化搜索 100pt
f [ i ][ j ] 也就是 f [ pos ][ level ] 前 i 首歌音量不超过 j 的最大音量
初始化 -1
记忆化避免了重复搜索,开数组的目的其实是记录下当前状态在之前有没有被搜到过,如果搜到过直接返回它
(其实后面改DP的时候发现 f 数组里面可以没有实际内容,只是记录下有没有搜到过罢了)
100 pt code
//100 pt ji yi hua dfs
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<string>
#include<cstring>
#include<queue> using namespace std; typedef long long ll; inline int read()
{
int ans=;
char last=' ',ch=getchar();
while(ch<''||ch>'') last=ch,ch=getchar();
while(ch>=''&&ch<='') ans=ans*+ch-'',ch=getchar();
if(last=='-') ans=-ans;
return ans;
} int n,star,maxl;
int a[];
int f[][];
int ans=-; int dfs(int pos,int level)
{
if(pos>n) return ans=max(ans,level);
if(f[pos][level]!=-) return f[pos][level];
if(level+a[pos]>maxl&&level-a[pos]<) return -;
if(level+a[pos]<=maxl&&level+a[pos]>=)
f[pos][level]=max(f[pos][level],dfs(pos+,level+a[pos]));
if(level-a[pos]<=maxl&&level-a[pos]>=)
f[pos][level]=max(f[pos][level],dfs(pos+,level-a[pos]));
return f[pos][level];
} int main()
{
n=read();star=read();maxl=read();
for(int i=;i<=n;i++) a[i]=read();
memset(f,-,sizeof(f));
dfs(,star);
printf("%d\n",ans); return ;
}
solution 3 到达型 01 背包
(一开始试图直接敲正解,但是只想到了01背包而不是到达型。。。)
所谓到达型, f [ i ][ j ] 表示前 i 首歌,能否到达音量 j ,bool 数组记录即可
转移的时候就转移合法音量区间的就好
初始化 由于给出开始音量,所以只有 f [ 0 ][ beginlevel ] = 1
100 pt code
//100 pt 01 bag
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<string>
#include<cstring>
#include<queue> using namespace std; typedef long long ll; inline int read()
{
int ans=;
char last=' ',ch=getchar();
while(ch<''||ch>'') last=ch,ch=getchar();
while(ch>=''&&ch<='') ans=ans*+ch-'',ch=getchar();
if(last=='-') ans=-ans;
return ans;
} int n,star,maxl;
int a[];
bool f[][];
int ans=-; int main()
{
n=read();star=read();maxl=read();
for(int i=;i<=n;i++) a[i]=read();
f[][star]=; for(int i=;i<=n;i++)
for(int j=maxl;j>=;j--){
if(j-a[i]>=&&j-a[i]<=maxl) f[i][j]|=f[i-][j-a[i]];
if(j+a[i]>=&&j+a[i]<=maxl) f[i][j]|=f[i-][j+a[i]];
} for(int j=;j<=maxl;j++){
if(f[n][j]) ans=max(ans,j);
}
printf("%d\n",ans); return ;
}
PS:CE的原因
如果你不小心 CE 了,请不要使用 begin 作为变量
\ 完结撒花 /
到达型01背包---P1877 [HAOI2012]音量调节的更多相关文章
- 洛谷P1877 [HAOI2012]音量调节 [2017年4月计划 动态规划05]
P1877 [HAOI2012]音量调节 题目描述 一个吉他手准备参加一场演出.他不喜欢在演出时始终使用同一个音量,所以他决定每一首歌之前他都需要改变一次音量.在演出开始之前,他已经做好一个列表,里面 ...
- 洛谷 P1877 [HAOI2012]音量调节
P1877 [HAOI2012]音量调节 题目描述 一个吉他手准备参加一场演出.他不喜欢在演出时始终使用同一个音量,所以他决定每一首歌之前他都需要改变一次音量.在演出开始之前,他已经做好一个列表,里面 ...
- 到达型01背包---P1504 积木城堡
P1504 积木城堡 题解 到达型01背包 对于每一组城堡,它可以到达一些高度 但是我们要求的是所有背包可以到达的公共高度的最大值 f[ i ] 表示对于一组城堡,能否到达高度 j ,然后我们跑 n ...
- Luogu P1877 [HAOI2012]音量调节
题目描述 一个吉他手准备参加一场演出.他不喜欢在演出时始终使用同一个音量,所以他决定每一首歌之前他都需要改变一次音量.在演出开始之前,他已经做好一个列表,里面写着每首歌开始之前他想要改变的音量是多少. ...
- P1877 [HAOI2012]音量调节
题目描述 一个吉他手准备参加一场演出.他不喜欢在演出时始终使用同一个音量,所以他决定每一首歌之前他都需要改变一次音量.在演出开始之前,他已经做好一个列表,里面写着每首歌开始之前他想要改变的音量是多少. ...
- 洛谷—— P1877 [HAOI2012]音量调节
https://www.luogu.org/problem/show?pid=1877#sub 题目描述 一个吉他手准备参加一场演出.他不喜欢在演出时始终使用同一个音量,所以他决定每一首歌之前他都需要 ...
- bzoj2748: [HAOI2012]音量调节(背包)
2748: [HAOI2012]音量调节 题目:传送门 题解: sb省选题..呵呵一眼背包: f[i][j]表示第i时刻能否为音量j 代码: #include<cstdio> #inclu ...
- BZOJ 2748: [HAOI2012]音量调节【二维dp,枚举】
2748: [HAOI2012]音量调节 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 2010 Solved: 1260[Submit][Statu ...
- bzoj 2748: [HAOI2012]音量调节
2748: [HAOI2012]音量调节 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 872 Solved: 577[Submit][Status] ...
随机推荐
- 前端面试记录NO.1
后端转前端,离职后第一次面试,技术面试的时候还是比较虚的,因为基础不是很扎实.主要问了工作中用过哪些技术,主流框架的区别,jQuery的掌握情况,Ajax的掌握情况,cookie的基本内容,还有浏览器 ...
- 运维开发笔记整理-JsonResponse对象
运维开发笔记整理-JsonResponse对象 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.使用HttpResponse发送json格式的数据 1>.HttpRespo ...
- springboot Properties加载顺序源码分析
关于properties: 在spring框架中properties为Environment对象重要组成部分, springboot有如下几种种方式注入(优先级从高到低): 1.命令行 java -j ...
- python自动化
自动化测试一些问题 什么是自动化测试? 自动化测试,顾名思义,自动完成测试工作.通过一些自动化测试工具或自己造轮子实现模拟之前人工点点/写写的工作并验证其结果完成整个测试过程,这样的测试过程,便是自动 ...
- P2921 [USACO08DEC]在农场万圣节[SCC缩点]
题目描述 每年,在威斯康星州,奶牛们都会穿上衣服,收集农夫约翰在N(1<=N<=100,000)个牛棚隔间中留下的糖果,以此来庆祝美国秋天的万圣节. 由于牛棚不太大,FJ通过指定奶牛必须遵 ...
- Java8新特性--函数式编程
在jdk8中什么是函数式接口: 1.被@FunctionalInterface注解修饰的. 2.接口里边只有一个非default的方法. 满足以上2个条件的即为函数式接口,ps:即使一个接口没有被@F ...
- java中的strictfp的作用
自Java2以来,Java语言增加了一个关键字strictfp,虽然这个关键字在大多数场合比较少用,但是还是有必要了解一下. strictfp 的意思是FP-strict,也就是说精确浮点的意思.在J ...
- Spring Cloud Eureka 注册中心高可用机制
一.Eureka 正常工作流程 Service 服务作为 Eureka Client 客户端需要在启动的时候就要向 Eureka Server 注册中心进行注册,并获取最新的服务列表数据. Eurek ...
- jquery判断两次密码不一致
jquery检测输入密码两次不一样提示 输入密码: <input type="password" name="password1" id="pa ...
- Java Executor框架使用
Java Executor框架是Jdk1.5之后推出的,是为了更加方便的开发多线程应用而封装的框架: 相比传统的Thread类,Java Executor使用方便,性能更好,更易于管理,而且支持线程池 ...