题目

做饭

由于越高位越好,我们先得出能组成的最高位

\(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]火柴棍数字(背包)的更多相关文章

  1. BZOJ3324 : [Scoi2013]火柴棍数字

    为了使数字最大,首先要最大化其位数. 设$f[i][j][k]$表示从低到高考虑了$i$位,手头火柴棍个数为$j$,第$i$位是不是$0$时,最少移动多少根火柴. 若$f[i][0][非0]\leq ...

  2. [Swust OJ 179]--火柴棍(找规律)

    题目链接:http://acm.swust.edu.cn/problem/0179/ Time limit(ms): 1000 Memory limit(kb): 65535   Descriptio ...

  3. 繁繁的数字 背包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+ ...

  4. [LeetCode] Matchsticks to Square 火柴棍组成正方形

    Remember the story of Little Match Girl? By now, you know exactly what matchsticks the little match ...

  5. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  6. NOIP200806 火柴棒等式【B005】

    [B005]火柴棒等式[难度B]———————————————————————————————————————————————————————————— [题目要求] 给你n根火柴棍,你可以拼出多少个 ...

  7. NOIP2008提高组火柴棒等式(模拟)——yhx

    题目描述 给你n根火柴棍,你可以拼出多少个形如“A+B=C”的等式?等式中的A.B.C是用火柴棍拼出的整数(若该数非零,则最高位不能是0).用火柴棍拼数字0-9的拼法如图所示: 注意: 加号与等号各自 ...

  8. TYVJ P1012 火柴棒等式 Label:枚举

    背景 NOIP2008年提高组第二题 描述 给你n根火柴棍,你可以拼出多少个形如“A+B=C”的等式?等式中的A.B.C是用火柴棍拼出的整数(若该数非零,则最高位不能是0).用火柴棍拼数字0-9的拼法 ...

  9. noip2008 火柴棒等式

    P1149 火柴棒等式 1.9K通过 3.7K提交 题目提供者该用户不存在 标签搜索/枚举模拟2008NOIp提高组 难度普及- 提交该题 讨论 题解 记录   题目描述 给你n根火柴棍,你可以拼出多 ...

随机推荐

  1. 学习lofter 让图片适应各个分辨率的方法

    只要图片的分辨率足够大,那么可以任意的width,不用担心失真 那么就可以根据屏幕的分辨率给图片相应的宽度 大分辨率浏览 小分辨率浏览 两个分辨率的图片地址是一样的,排除了换图的可能 大分辨率下的代码 ...

  2. SlidingMenu官方实例分析3——PropertiesActivity

    PropertiesActivity此类主要是对SlidingMenu设置的一些展示,也是为了使用者能快速的掌握SlidingMenu 的特点. 首先获得SlidingMenu对象: SlidingM ...

  3. 如何解决mac下MAMP不能重启apache server的问题

    第一步:检查问题  在终端输入:sudo /Applications/MAMP/Library/bin/apachectl start  终端会提示你那个目录下的那个文件出现了什么问题 第二步:逐一排 ...

  4. linux 文件文件夹操作

    文件夹下查询哪些文件含有abc内容: find .|xargs grep -ri "abc"

  5. Python抓取豆瓣《白夜追凶》的评论并且分词

    最近网剧<白夜追凶>在很多朋友的推荐下,开启了追剧模式,自从琅琊榜过后没有看过国产剧了,此剧确实是良心剧呀!一直追下去,十一最后两天闲来无事就抓取豆瓣的评论看一下 相关代码提交到githu ...

  6. Core Services层

    本文转载至 http://jingyan.baidu.com/article/cdddd41c57360853cb00e124.html Core Services层是系统很多部分的基础部分,也许应用 ...

  7. UTI iPhone支持依文件后缀名打开应用

    本文转载至 http://blog.csdn.net/zaitianaoxiang/article/details/6658492 iphoneapplicationprocessingfileurl ...

  8. L - Points on Cycle(旋转公式)

    L - Points on Cycle Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u ...

  9. CSS Float浮动所带来的奇怪现象

    先抛个例子出来 运行下面的例子后,可以看到输出内容如下. <!DOCTYPE html> <html lang="en"> <head> < ...

  10. Spring基础知识详解

    Spring 概述 1. 什么是spring? Spring 是个java企业级应用的开源开发框架.Spring主要用来开发Java应用,但是有些扩展是针对构建J2EE平台的web应用.Spring ...