poj 7222 怀表问题(递推+空间压缩)

本文介绍了如何使用递推和空间压缩技术解决POJ 7222题——怀表问题。通过分析四种不同的表扣设计,提出两种不同的解决方案:version 1 使用dp数组,通过压缩空间来适应内存限制;version 2 利用记忆化搜索,通过巧妙的编号优化空间,实现更高效的时间复杂度。文章强调了审题的重要性,并对比了两种方案的优劣。
摘要由CSDN通过智能技术生成

poj 7222 怀表问题(递推+空间压缩) 程序设计实习2015上机练习43题第42题
总时间限制: 1000ms 内存限制: 32768kB

描述
怀表是由一个表链和一个表盘连接而成的。同时,表链又是由多个长度为1的表链组件连接而成的。小明现有一个表盘和多个长度为1的表链组件。他希望组合成一个完整的怀表当做生日礼物送给爸爸。

表盘和表链组件的两端都有表扣可以和其它的表链组件或者表盘相连。 一共有两种表扣设计,分别是“L” 和“V”。表链组件和表盘的左右两端可以使用相同的或者不同的表扣设计,因此我们有以下四种不同的表链组件和表盘设计方式,“LL”, “LV”, “VL”, “VV”,如“LV”表示左端的表扣设计是”L”, 右端的表扣设计是“V”。另,表盘和表链是不允许上下左右翻转的。如果把两个表链组件或者一个表链组件和表盘相连接,那么相连部分的表扣设计必须一致。此外,还必须确保表盘可以连接到表链的任意一端。

例子1:表盘是“LV”,共有5个表链组件分别是,“LL”, “LL”, “LV”, “VL”, “VL” 。现在希望组合成长度为4的怀表(表链长度是4)。 有两种正确的表链组合方式:“VLLLLVVL” 和“VLLVVLLL”。而且,对于每一种表链的组合方式,表盘都可以连接到表链的左右两端 (表盘放到表链左端使用V相连,表盘放到表链右端使用L相连)。

例子2: 表盘是“LL”,共有4个表链组件分别是,“LL”, “LV”, “VL”, “VV”。现在希望组合成长度为3的怀表(表链长度是3)。有三种正确的表链组合方式:“LLLVVL”, “LVVLLL”和“LVVVVL”。而且,对于每一种表链的组合方式,表盘都可以接到表链的任一端.

注意怀表的组合方式可能不唯一。每一种表链的组合方式都可以当做是一个由”L”和“V”

组成的字符串。如果两种表链对应的字符串是不匹配的, 那么表链也是不相同的。

输入
标准的输入包含若干组测试数据。每组数据第一行是整数N (0 < N ≤ 40)和K (0 < K ≤ N) 。
N 代表表链组件的个数,K代表要组合成的怀表长度(表链组件的个数)。 接着的N+ 1 行描述表盘(第二行)和表链组件的表扣设计。有四种可能输入: “LV”, “LL”, “VV” 和“VL”。

输出
对于每组测试数据,输出一行。 输出“YES”, 如果可能按照要求组合成怀表,并输出可能的组合方式的数目。如果不能,则输出”NO”.

样例输入

4 4
LV
LL
LV
VL
VL
4 4
VL
LL
LV
VL
VL

样例输出

YES
2
NO

提示
提示: 本题需要使用 long long 数据类型。


最近在重新练习程序设计实习43题,这里剩下一些有难度的题目很好。主要是怀表问题,选择客栈,潘多拉星球的悬浮公寓。前两个有些递推/数学算法在里头,最后一个题目很精彩,虽然算法很熟悉,但是细节不好处理。
哎,首先我审题不仔细的老毛病没有改尤其是当题目似乎比较熟悉的时候就没有动脑子了…各种理解错误,幸好最后又读了一遍题目总算改出了这些低级错误,但是考试的时候恐怕题目一难,心里一慌,时间不够就没有那么幸运了吧。所以以后一定要审题仔细。
这个题目,首先想到递推,用 dp[i][n0][n1][n2][n3] 表示两头为i时候四种表为n1,n2,n3,n4个时候种数(注意要开long long int,看提示)。但是要记录的数据比较多,简单计算一下空间 Memory=sizeof

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值