[SCOI2013]火柴棍数字(背包)
题目
做饭
由于越高位越好,我们先得出能组成的最高位
\(f[i][j][k]\)表示从低到高位第\(i\)位,手里拿着\(j\)根火柴,第\(i\)位是否为\(0\)所需要的最少火柴
我们转移仅需得出移动,与多余或需添的映射关系;然后枚举变化关系去转移
得出最高位后,直接贪心看目前所在最高位是否能添某个数字(最大)
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=3510;
int n,m,all,use,len,i,j,k,x;char a[N];
short f[N/2][N*2][2];
int S[10]={126,48,107,121,53,93,95,112,127,125},dx[11][10],dy[11][10];
inline void up(short&x,short y){if(x>y)x=y;}
int main(){
for(i=0;i<10;i++)
for(j=0;j<10;j++)
for(k=0;k<7;k++){
if(!(S[i]>>k&1)&&(S[j]>>k&1))
dx[i][j]++,dy[i][j]++;//dy:remove dx:increase
if((S[i]>>k&1)&&!(S[j]>>k&1))
dx[i][j]--;
}
for(i=0;i<10;i++)
for(k=0;k<7;k++)
if(S[i]>>k&1)
dx[10][i]++,dy[10][i]++;
scanf("%s%d",a+1,&m);
n=strlen(a+1);
reverse(a+1,a+n+1);//最低位排前面
for(i=1;i<=n;i++)
a[i]-='0';
for(i=1;i<=n;i++)
all+=dy[10][a[i]];//总火柴
len=all/2;
for(i=n+1;i<=len;i++)
a[i]=10;
for(i=0;i<=len;i++)
for(j=-m;j<=m;j++)
for(k=0;k<2;k++)
f[i][j+N][k]=m+1;
f[0][N][0]=0;//N:0
for(i=0;i<len;i++)
for(j=-m;j<=m;j++)
for(k=0;k<2;k++)
if(f[i][j+N][k]<=m)
for(x=0;x<10;x++){
up(f[i+1][j+N+dx[a[i+1]][x]][x==0],
f[i][j+N][k]+dy[a[i+1]][x]);
}
while(f[len][N][0]>m)len--;//最长长度
for(i=0;i<=len;i++)
for(j=-m;j<=m;j++)
up(f[i][j+N][0],f[i][j+N][1]);
for(all=0,i=len;i;i--)
for(j=9;~j;j--){
all+=dx[a[i]][j],
use+=dy[a[i]][j];
if(f[i-1][N-all][0]<=m-use){
printf("%d",j);break;
}
all-=dx[a[i]][j],use-=dy[a[i]][j];
}
return 0;
}
[SCOI2013]火柴棍数字(背包)的更多相关文章
- BZOJ3324 : [Scoi2013]火柴棍数字
为了使数字最大,首先要最大化其位数. 设$f[i][j][k]$表示从低到高考虑了$i$位,手头火柴棍个数为$j$,第$i$位是不是$0$时,最少移动多少根火柴. 若$f[i][0][非0]\leq ...
- [Swust OJ 179]--火柴棍(找规律)
题目链接:http://acm.swust.edu.cn/problem/0179/ Time limit(ms): 1000 Memory limit(kb): 65535 Descriptio ...
- 繁繁的数字 背包DP
繁繁的数字 背包DP 问一个数\(n\)有多少种二进制分解方案数 \(n\le 10^5\) 如7有7=4+2+1=4+1+1+1=2+2+2+1=2+2+1+1+1=2+1+1+1+1+1=1+1+ ...
- [LeetCode] Matchsticks to Square 火柴棍组成正方形
Remember the story of Little Match Girl? By now, you know exactly what matchsticks the little match ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- NOIP200806 火柴棒等式【B005】
[B005]火柴棒等式[难度B]———————————————————————————————————————————————————————————— [题目要求] 给你n根火柴棍,你可以拼出多少个 ...
- NOIP2008提高组火柴棒等式(模拟)——yhx
题目描述 给你n根火柴棍,你可以拼出多少个形如“A+B=C”的等式?等式中的A.B.C是用火柴棍拼出的整数(若该数非零,则最高位不能是0).用火柴棍拼数字0-9的拼法如图所示: 注意: 加号与等号各自 ...
- TYVJ P1012 火柴棒等式 Label:枚举
背景 NOIP2008年提高组第二题 描述 给你n根火柴棍,你可以拼出多少个形如“A+B=C”的等式?等式中的A.B.C是用火柴棍拼出的整数(若该数非零,则最高位不能是0).用火柴棍拼数字0-9的拼法 ...
- noip2008 火柴棒等式
P1149 火柴棒等式 1.9K通过 3.7K提交 题目提供者该用户不存在 标签搜索/枚举模拟2008NOIp提高组 难度普及- 提交该题 讨论 题解 记录 题目描述 给你n根火柴棍,你可以拼出多 ...
随机推荐
- Windows 下tomcat安装及将多个tomcat注册为Windows服务
一.应用场景 虽然Windows在当下已经不再是我们作为服务器操作系统平台的首选,但是还是有一些开发商或者项目整体需求的限制必须运行在Windows系统平台之下.为了避免多个应用部署在同一个tomca ...
- Tensorflow如何选择GPU
CUDA_VISIBLE_DEVICES=1 python run.py or import os os.environ["CUDA_VISIBLE_DEVICES"]=" ...
- Python Socket 网络编程 (服务器端编程)
服务器端主要做以下工作: 打开 socket 绑定到特定的地址以及端口上 监听连接 建立连接 接收/发送数据 上面已经介绍了如何创建 socket 了,下面一步是绑定. 绑定 socket 函数 bi ...
- 解决ionic 2载入速度慢的问题
1.ionic build android --prod 使用生产环境的服务器 (最关键部分) [--production-mode=y,n] ................. Tell Io ...
- Python gevent学习笔记-2
在上一篇里面介绍了gevent的最主要的功能,先来来了解一下gevent里面一些更加高级的功能. 事件 事件是一种可以让greenlet进行异步通信的手段. ? 1 2 3 4 5 6 7 8 9 1 ...
- Golang中的正则表达式
声明:文章转自GoLove 用法: 单一: . 匹配任意一个字符,如果设置 s = true,则可以匹配换行符 [字符类] 匹配"字符类"中的一个字符,"字符类" ...
- 头一次玩博客,记录下我的java之路吧
今天写了简单的后台管理系统,发现光靠脑子记住知识真的很难,笔记本不好翻,之前写的代码更难找,所以写写博客,记录一些知识,为了以后上班用得到.
- Android无线测试之—UiAutomator UiObject API介绍二
点击与长按 一.组件区域位置关系 Rect 对象代表一个矩形区域 [Left,Top] [Right,Bottom] 二.点击与长按API 返回值 API 描述 boolean click() 点击对 ...
- encodeURI() 函数概述
encodeURI() 函数的作用是将URI中的某些特定的字符以一位到四位的转义序列来替代,这些转义序列就是这些字符的UTF-8编码(如果说某些字符是由两个代替字符构成的,该字符也只会是四位的转义序列 ...
- 对 pthread 做的一个简陋封装
参考自 pthreadcc 库的 ThreadBase 类 用法:继承该类,重写 execute 方法,调用父类的 launchThread 方法启动线程 Thread.h // // Thread. ...