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+1 int 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,以下是我的解题报告索引,每一题几乎都有详细的说明,供各位码农参考.根据我自己做的进度持续更新中...... ...
随机推荐
- Unix/Linux环境C编程新手教程(41) C语言库函数的文件操作具体解释
上一篇博客我们解说了怎样使用Linux提供的文件操作函数,本文主要解说使用C语言提供的文件操作的库函数. 1.函数介绍 fopen(打开文件) 相关函数 open,fclose 表头文件 #in ...
- Asp.Net MVC5入门学习系列⑦
原文:Asp.Net MVC5入门学习系列⑦ 接着上篇结尾所说,如果开发中刚才遇到Model需要添加或者减少字段/属性的话,但是刚好你也利用EF的Code frist通过Model生存的数据库,这时改 ...
- Asp.Net MVC4 + Oracle + EasyUI + Bootstrap
Asp.Net MVC4 + Oracle + EasyUI + Bootstrap --操作数据和验证 本文链接:http://www.cnblogs.com/likeli/p/4234238.ht ...
- [推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下)
原文:[推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下) [推荐]ORACLE PL/SQL编程详解之一: PL/SQL 程序设计简介(千里之行,始于足下 ...
- 项目笔记---CSharp图片处理
原文:项目笔记---CSharp图片处理 项目笔记---CSharp图片处理 最近由于项目上需要对图片进行二值化处理,就学习了相关的图片处理上的知识,从开始的二值化的意义到动态阀值检测二值化等等,并用 ...
- Mvc 下载文件
你如何将文件传送给用户取决于你最开始如何存储它,如果你将文件存入数据库,你会用流的方式将文件返还给用户,如果你将文件存在硬盘中,你只需要提供一个超链接即可,或者也可以以流的方式.每当你需要以流的方式将 ...
- Linux文件系统文件大小限制
去阿里面试,被问到了Linux文件系统中文件大小的限制,当时就无语了.学操作系统时这些都是现算的,回来赶紧查一下. 以下为红帽ext3文件系统所支持的max file size和max filesys ...
- cocos2dx对于强大的RichText控制
最近准备做一个聊天系统,开始准备使用cocos2dx的UIRichText控制显示屏聊天,在使用中发现的结果,cocos2dx的RichText很有限.全然不具备实现聊天的功能.仅仅实现了增加文本.图 ...
- C# 导入导出excel文件案例
个人总结导出excel报表的案例: //导出报表 protected void btnExport_Click(object sender, EventArgs e) { List<ProOut ...
- ASP.NET MVC Model元数据
ASP.NET MVC Model元数据(三) 前言 在上篇中我们大概的讲解了Model元数据的生成过程,并没有对Model元数据本身和详细的生成过程有所描述,本篇将会对详细的生成过程进行讲解,并且会 ...