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]音量调节的更多相关文章

  1. 洛谷P1877 [HAOI2012]音量调节 [2017年4月计划 动态规划05]

    P1877 [HAOI2012]音量调节 题目描述 一个吉他手准备参加一场演出.他不喜欢在演出时始终使用同一个音量,所以他决定每一首歌之前他都需要改变一次音量.在演出开始之前,他已经做好一个列表,里面 ...

  2. 洛谷 P1877 [HAOI2012]音量调节

    P1877 [HAOI2012]音量调节 题目描述 一个吉他手准备参加一场演出.他不喜欢在演出时始终使用同一个音量,所以他决定每一首歌之前他都需要改变一次音量.在演出开始之前,他已经做好一个列表,里面 ...

  3. 到达型01背包---P1504 积木城堡

    P1504 积木城堡 题解 到达型01背包 对于每一组城堡,它可以到达一些高度 但是我们要求的是所有背包可以到达的公共高度的最大值 f[ i ] 表示对于一组城堡,能否到达高度 j ,然后我们跑 n ...

  4. Luogu P1877 [HAOI2012]音量调节

    题目描述 一个吉他手准备参加一场演出.他不喜欢在演出时始终使用同一个音量,所以他决定每一首歌之前他都需要改变一次音量.在演出开始之前,他已经做好一个列表,里面写着每首歌开始之前他想要改变的音量是多少. ...

  5. P1877 [HAOI2012]音量调节

    题目描述 一个吉他手准备参加一场演出.他不喜欢在演出时始终使用同一个音量,所以他决定每一首歌之前他都需要改变一次音量.在演出开始之前,他已经做好一个列表,里面写着每首歌开始之前他想要改变的音量是多少. ...

  6. 洛谷—— P1877 [HAOI2012]音量调节

    https://www.luogu.org/problem/show?pid=1877#sub 题目描述 一个吉他手准备参加一场演出.他不喜欢在演出时始终使用同一个音量,所以他决定每一首歌之前他都需要 ...

  7. bzoj2748: [HAOI2012]音量调节(背包)

    2748: [HAOI2012]音量调节 题目:传送门 题解: sb省选题..呵呵一眼背包: f[i][j]表示第i时刻能否为音量j 代码: #include<cstdio> #inclu ...

  8. BZOJ 2748: [HAOI2012]音量调节【二维dp,枚举】

    2748: [HAOI2012]音量调节 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 2010  Solved: 1260[Submit][Statu ...

  9. bzoj 2748: [HAOI2012]音量调节

    2748: [HAOI2012]音量调节 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 872  Solved: 577[Submit][Status] ...

随机推荐

  1. extern "C" 分析 -转

    1.引言 C++语言的创建初衷是“a better C”,但是这并不意味着C++中类似C语言的全局变量和函数所采用的编译和连接方式与C语言完全相同.作为一种欲与C兼容的语言,C++保留了一部分过程式语 ...

  2. kali 系统膨胀后如何处理

    1.一般使用的kali 安装都是将系统文件全部放在一个总分区中,应用程序会产生临时文件,另外在安装软件的时候会出现 系统框架的不同,但是kali并不会检测该问题,直接当依赖的框架下载,可以是使用命令 ...

  3. DNS服务——域名解析容错

    介绍 DNS服务至关重要,你我每天访问网站不可能是记忆IP地址.因此DNS服务器的可靠性至关重要.下面介绍DNS服务器容错机制,看图 为了防止DNS服务器故障不再提供服务,引入辅助DNS服务器.辅助D ...

  4. yum nginx最新版安装

    去官方站点获取yum仓库 [root@web01 ~]# cat /etc/yum.repos.d/nginx.repo [nginx] name=nginx repo baseurl=http:// ...

  5. WebApi 接口恶意请求限制

    为了防止爬虫以及恶意请求,我们适当的为API增加一个请求限制   WebApiThrottle限流框架    WebApiThrottle支持自定义配置各种限流策略.可以根据不同场景配置多个不同的限制 ...

  6. Java线程(1)

    多线程快速入门 线程与进程区别 每个正在系统上运行的程序都是一个进程.每个进程包含一到多个线程.线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行.也可以把它理解为代码运行的上下文.所以 ...

  7. Jenkins手把手图文教程[基于Jenkins 2.164.1]

    原文:http://www.itmuch.com/work/jenkins-in-action/ 一.下载 前往https://jenkins.io/download/ ,按需下载.如用于生产,建议下 ...

  8. java相关网址汇总2

    分享几个高质量的技术博客和网站. 一.博客 0.酷壳 - COOLSHELL 博客地址是 https://coolshell.cn/. 这个博客的作者是技术圈基本无人不知的技术大牛,江湖人称耗子叔,网 ...

  9. python中set(集合),深浅拷贝以及一些补充知识点

    1.set集合 特点:无序,不重复,元素必须可哈希(不可变) 作用:去重复 本身是可变的数据类型.有增删改查操作.{集合的增删改查操作应用较少,这里不做详细介绍了(这里的增有一个方法update注意这 ...

  10. git 在不同服务器主机上同步 git 仓库

    git 在不同服务器主机上同步 git 仓库 参考链接:https://opentechguides.com/how-to/article/git/177/git-sync-repos.html 1. ...