poj1173 解题报告
poj1173 解题报告2013-07-21 13:31 by 期待 、, 42 阅读, 0 评论, 收藏, 编辑
http://poj.org/problem?id=1173
【题意】
输出这种模式的条形码的有多少个?
输入s,再输入s个二进制形式的条形码
输出每个条形码在该模式中的序号,序号是根据二进制条形码的十进制数值排序,序号从0开始。
【解题思路】
动态规划+组合数学。
我们举一个例子:n=7,k=4,m=3。
⑴计算个数
要计算此模式条形码的数量,那么我们只要分别计算出
n=6,k=3,m=3。
n=5,k=3,m=3。
n=4,k=3 ,m=3。
再讲他们相加即可。
扩展到一般,得公式 [n,k] = ∑[n-i,k-1](i = 1,2···m-1,m)
根据推算,我们可以将公式化简成 [n,k] = [n-1,k] + [n-1,k-1] - [n-m-1,k-1]
我们令[0,0]=1, 令 [0,1]至[0,k] 和 [1,0]至[k,0] =0,其余的值都可以通过递推得到
⑵计算序号
首先将 长度为n的二进制条形码 转换成 长度为k的向量,例如 1101110 -》 2131(2个1,1个0,3个1,1个0)
2131之前的条形码可以分为四部分:
1??? [6,3] = 7
22?? [3,2] = 1
23?? [2,2] = 2
211? [3,1] = 1
212? [2,1] = 1
合计为12 对照下面题目给出的表 确是如此
至于究竟上面是如何弄出来的,需要分黑条和白条分别考虑,不是很好说明,看代码应该能懂。
还有一点,我们都知道0在二进制位里面越前,1越后,则该数值会越小(即序号越小)。
0: 1000100 | 8: 1100100
1: 1000110 | 9: 1100110
2: 1001000 | 10: 1101000
3: 1001100 | 11: 1101100
4: 1001110 | 12: 1101110
5: 1011000 | 13: 1110010
6: 1011100 | 14: 1110100
7: 1100010 | 15: 1110110
【代码】
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
|
#include <iostream>using namespace std; int n,k,m;int dp[40][40]={0};//下标分别对应着 n+1 和 k+1int s;char bin[40];//存储每次输入的二进制串int vec[40];//将二进制的bin数组 转换成 k部分的向量int count[102]; void table()//打表 计算还剩 n位 和 k部分时 有多少种情况{ dp[0][0]=1; for(int j=1;j<=k;j++)//一列列的计算 for(int i=1;i<=n;i++) { dp[i][j]=dp[i-1][j]+dp[i-1][j-1];//等于 左上和上面 这2个之和 if(i-m-1>=0) dp[i][j]-=dp[i-m-1][j-1]; }} void binToVec()//将二进制的bin数组 转换成 k部分的向量 并且保存到vec数组中{ int c=0; char first; for(int i=0,j=0;i<n;i--) { c=1; first=bin[i++]; while(bin[i++]==first) { c++; } vec[j++]=c; }} int countOrder()//计算该二进制的序号{ int count = 0; for(int i=0,u=n;i<k-1;i++) { if(i%2==0)//针对编码为1的部分 { for(int j=1;j<vec[i];j++) { if(u>=j) count+=dp[u-j][k-i-1]; } } else//针对编码为0的部分 { for(int j=m;j>vec[i];j--) { if(u>=j) count+=dp[u-j][k-i-1]; } } u-=vec[i]; } return count;} int main(){ cin>>n>>k>>m; table(); cin>>s; for(int i=0;i<s;i++) { cin>>bin; binToVec(); count[i] = countOrder(); } cout<<dp[n][k]<<endl;//输出总共有多少种 for(int i=0;i<s;i++)//输出相应二进制编码的序号 { cout<<count[i]<<endl; }} |
【转载请注明出处】
http://www.cnblogs.com/hezhichao/p/3203639.html
http://user.qzone.qq.com/454822252/blog/1374384518#!app=2&via=QZ.HashRefresh&pos=1374384518
poj1173 解题报告的更多相关文章
- CH Round #56 - 国庆节欢乐赛解题报告
最近CH上的比赛很多,在此会全部写出解题报告,与大家交流一下解题方法与技巧. T1 魔幻森林 描述 Cortana来到了一片魔幻森林,这片森林可以被视作一个N*M的矩阵,矩阵中的每个位置上都长着一棵树 ...
- 二模13day1解题报告
二模13day1解题报告 T1.发射站(station) N个发射站,每个发射站有高度hi,发射信号强度vi,每个发射站的信号只会被左和右第一个比他高的收到.现在求收到信号最强的发射站. 我用了时间复 ...
- BZOJ 1051 最受欢迎的牛 解题报告
题目直接摆在这里! 1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4438 Solved: 2353[S ...
- 习题:codevs 2822 爱在心中 解题报告
这次的解题报告是有关tarjan算法的一道思维量比较大的题目(真的是原创文章,希望管理员不要再把文章移出首页). 这道题蒟蒻以前做过,但是今天由于要复习tarjan算法,于是就看到codevs分类强联 ...
- 习题:codevs 1035 火车停留解题报告
本蒟蒻又来写解题报告了.这次的题目是codevs 1035 火车停留. 题目大意就是给m个火车的到达时间.停留时间和车载货物的价值,车站有n个车道,而火车停留一次车站就会从车载货物价值中获得1%的利润 ...
- 习题: codevs 2492 上帝造题的七分钟2 解题报告
这道题是受到大犇MagHSK的启发我才得以想出来的,蒟蒻觉得自己的代码跟MagHSK大犇的代码完全比不上,所以这里蒟蒻就套用了MagHSK大犇的代码(大家可以关注下我的博客,友情链接就是大犇MagHS ...
- 习题:codevs 1519 过路费 解题报告
今天拿了这道题目练练手,感觉自己代码能力又增强了不少: 我的思路跟别人可能不一样. 首先我们很容易就能看出,我们需要的边就是最小生成树算法kruskal算法求出来的边,其余的边都可以删掉,于是就有了这 ...
- NOIP2016提高组解题报告
NOIP2016提高组解题报告 更正:NOIP day1 T2天天爱跑步 解题思路见代码. NOIP2016代码整合
- LeetCode 解题报告索引
最近在准备找工作的算法题,刷刷LeetCode,以下是我的解题报告索引,每一题几乎都有详细的说明,供各位码农参考.根据我自己做的进度持续更新中...... ...
随机推荐
- std::move()
#include <iostream> #include <utility> #include <vector> #include <string> i ...
- JS时间戳比较大小:对于一组时间戳(开始时间~结束时间)和另一组时间戳进行比较,用于判断被比较时间戳组是否在要求范围内
/* *JS时间戳比较大小:对于一组时间戳(开始时间~结束时间)和另一组时间戳进行比较,用于判断被比较时间戳组是否在要求范围内 *@param date1 date2(形如:'2015-01-01'类 ...
- 在VirtualBox下安装CentOS教程(截图版)
http://blog.csdn.net/kobe_lzq/article/details/7894718 使用的软件: VirtualBox 4.1.2 CentOS 5.6 x86_64 刻录的 ...
- Android的FrameLayout使用要注意的问题
帧布局FrameLayout在Android的五大布局中是最简单的布局方式,在需要布局中的控件有重叠的情况下才使用. 今天Shamoo使用FrameLayout的时候,发现布局里面的控件设置layou ...
- ajax的post请求
get和post是http请求方法最主要的两种方式. post: 来个例子test.html <!doctype html> <html lang="en"> ...
- 实时预览的在线 Markdown 编辑器 - Markdoc
实时预览的在线 Markdown 编辑器 - Markdoc 最近组内需要为一些项目和系统写文档,发表在公司内的文档平台上,这个平台并不支持markdown,所以打算做一个在线markdown编辑器, ...
- J2EE开发HelloWorld
J2EE开发实战基础系列一 HelloWorld 开始咱们的第一个程序,首先是配置环境,按照上一章所描述的方式下载开发工具,然后配置Java环境变量,给大家看下具体的结构: 环境变量配置OK的提示,如 ...
- 树莓派学习笔记 1 -- 硬件的需求以及raspbian系统的安装
树莓派(Raspberry Pi) -- 基于Linux系统的大小只有信用卡大小的卡片式机器. 按照发明者的想法,他是想降低学习程序开发的成本而设计制作的这款产品.你可以理解为一个简陋版的电脑.树 ...
- 13个不可不知的ASP.NET MVC扩展点
13个不可不知的ASP.NET MVC扩展点 ASP.NET MVC设计的主要原则之一是可扩展性.处理管线(processing pipeline)上的所有(或大多数)东西都是可替换的.因此,如果您不 ...
- 【WCF系列一】WCF入门教程(图文) VS2012
WCF的全称是Windows Communication Foundation,从英文名称上看,WCF就是基于Windows下一种通讯的基础架构.利用WCF能够实现基于Windows下的各种通讯技术的 ...