铺格子问题(PKU2506)

PKU2506Tiling 从这篇的标题可以看出……个寂寞,第一眼看到这个标题,大部分人绝对是一脸蒙的。 回归正题。 有人说,dp太难了,说我怎么一上来就写dp的题目(其实是自己觉得难),所以今天就降一个level,讲道递推的题。 题目如下:对于一个2N走道。现在用12,22铺满有多少种不同的方式。下图是一个217走道的某种法。整个测试有多组数据,请做到文件底结束。每给出一个数字N,0 ......... 阅读详情

先看题目:

对于一个2行N列的走道。现在用1*2,2*2的砖去铺满。问有多少种不同的方式。

上图是一个2行17列的走道的某种铺法。

不难看出,本题的核心其实就是用一个1*2或2*2的矩阵去填充一个2*N的矩阵,这跟有一道填色的竞赛题颇为相似,那么本题隶属于OJ的递归I专题,所以自然要用递归前去解答。

思路分析

首先,让我们从特殊推演到一般,假设是一个1*2的矩阵,那么答案很简单,就是用一个1*2去铺他;如果是一个2*2的矩阵,那么可以是1*2两个竖,两个横,一个2*2,一共3种;随后经过严密且复杂的数学推演,可以得到2*3时是5种,2*4时是11种。让我们明显的分析一下吧。

现在得到了一个数列:

1,3,5,11,21,43……————————arrayI

对其进行二级处理,得到:

2,2,6,10,22……——————————arrayII

对其进行三级处理,得到:

0,4,4,12……————————————arrayIII

四级:

4,0,8……——————————————arrayIV

此时规律就有所找寻了

我们设每个array的i项为aI,依次有aII,aIII,aIV……

从arrayI开始:

arrayI-aI=5=1+1+3,arrayI-aII=11=3+3+5……

推广出去,对于其二级,三级,四级都是适用的,所以得到递归式:

f(i)=f(i-1)+f(i-2)*2;

数学表达式:

所以程序也就很清晰了:

程序设计

#include<bits/stdc++.h>
using namespace std;
long long go(int n)//定义递归函数go来表示填色的步骤 
{
	long long sum[3] = {0};
	sum[1] = 1;
	sum[2] = 3;
	sum[3] = 5;
	if(n == 1)
	return 1;
	if(n == 2)
	return 3;
	if(n == 3)
	return 5;//递归边界 
	else
	return go(n - 2) * 2 + go(n - 1);//递归表达式 
}
int main()
{
	int step;//宽度 
	int n;
	while(cin >> n)
	{
		scanf("%d",&step);
		go(step);
		printf("%d",go(step));//边输入边输出 
	}
	return 0;
}

祝五楼机房同志好运!!

24k24k

2020年9月青少年C/C++软件编程(三级)等级考试试卷及答案解析 阅读详情

相关推荐

[OpenJudge] 2.3基本算法之递归变递推 PKU2506Tiling

9273:PKU2506Tiling 一,描述 对于一个2N走道。现在用1*2,2*2铺满有多少种不同的方式。 下图是一个217走道的某种法。 输入 整个测试有多组数据,请做到文件底结束。每给出一个数字N,0 &lt;= n &lt;= 250 输出 如题 样例输入 2 8 12 100 200 样例输出 3 171 2731 84...

u013838115的博客 1161

C++题解:

目录 题目 题解 题目 对于一个2N走道。现在用1×2,2×2铺满有多少种不同的方式。 下图是一个217走道的某种法。 输入格式 一个数字N,0≤n≤250。 输出格式 方案数。(对 100007取模)。 输出时每末尾的多余空格,不影响答案正确性 要求使用「文件输入输出」的方式解题,输入文件为wall.in,输出文件为wall.out 样例输入1 2 样例输出1 3 样例输入2 8 样例输出2...

Keven_11的博客 5520

C语言(CED)对于一个2N走道。现在用1*2,2*2铺满有多少种不同的方式(递归求解)

又涉及到递归问题,这道题的大致内容是这样的: (请用递推方式求解)对于一个2N走道。现在用1*2,2*2铺满有多少种不同的方式。下图是一个217走道的某种法。 提示:观察前n个结果,可以得到递推式子;如果N很大,需要高精度计算。 其实这道题,与之前的方格涂色问题很像,说它像不仅因为在思考方式上很像,在最后的代码上也很想像,听我一一道来。 题目提示,先观...

Cat 8755

Pku2856 我的第一百道题!

一百道题目了,整个集训的末尾,我也达到了这个三位数,虽然不是很厉害,对我来说是另外的一个起点。开始向更低的AC率的题目挑战。100道题目,做出来我也觉得不容易! 我的第一百道题是最近的一次Pku比赛题目,当时没有做出来,今天完成了,觉得我的想法都是正确的,但是编出来后改了好久才AC!截个图留念: 我的程序代码:Repeatless Numbers Time Limit:10

大度能容天下剑 1484

9273:PKU2506Tiling

描述对于一个2N走道。现在用1*2,2*2铺满有多少种不同的方式。下图是一个217走道的某种法。输入整个测试有多组数据,请做到文件底结束。每给出一个数字N,0 &lt;= n &lt;= 250输出如题样例输入2 8 12 100 200样例输出3 171 2731 845100400152152934331135470251 1071292029505993517027...

未来有个世界等着你 1719

【递推+高精度加法】PKU2506Tiling题解

题目:OpenJudge - 9273:PKU2506Tiling 思路:一道基础的递推题,用二维dp数组存答案(号→n) 易得第n块有两种情况:①竖放的1*2→dp[i][j]+=dp[i-1][j]; ②2*2或横放的1*2→dp[i][j]+=dp[i-2][j]; 所以得到了我们的递推公式→dp[i][j]=dp[i-1][j]+dp[i-2][j]*2 PS:为了方便输出,用dp[i][...

weixin_61096287的博客 1199

OpenJudge NOI 2.2 9273:PKU2506Tiling | 2.3 9273:PKU2506Tiling

因此可以把高精度数字的位数设为255。n最大为250,因此该题结果最大值。使用类和重载运算符,记忆化递归。因此该题必须使用高精度计算。也一定是一个高精度数字。,是一个高精度数字。

君义NOIP的博客 1314

NOIP学习之递推:196.PKU2506Tiling

设f(n)表示铺满n走道的方法数。f(1)=1,f(2)=3;当n>3时,1*2横放,有f(n-2)种,1*2竖放,有f(n-1)种,2*2,有f(n-2)种,所以 f(n)=f(n-1)+2*f(n-2),这是递推关系式。另外,数据量比较大,要用高精度加法来实现。

wlxiong的博客 290

递归--练习11--noi9273 PKU2506Tiling

递归--练习11--noi9273 PKU2506Tiling 一、心得 25 a[i]%=10;(高精度时) 26 这里错了,花了好久改好 27 28 29 int* f(int n){ 30 if(dp[n][0]!=0) return dp[n]; 31 else if(0==n) return dp[0]; 32 else i...

weixin_34377065的博客 315

POJ 2506 Tiling

Tiling Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6444   Accepted: 3149 Description In how many ways can you tile a 2xn rectangle by 2x1 or 2x2 tiles?

ACM2272902662的专栏 764

【递推】C002_pku 2506 Tiling(暴搜 / 大数 / dp + 高精度)

一、Problem 对于一个 2 N 走道。现在用 12,221*2, 2*212,22铺满有多少种不同的方式。 下图是一个217走道的某种法。 输入 整个测试有多组数据,请做到文件底结束。每给出一个数字N,0 <= n <= 250 样例输入 2 8 12 100 200 样例输出 3 171 2731 8451004001521529343...

无敌兔0x01 448

a9273:PKU2506Tiling

时间限制: 2000ms 单个测试点时间限制: 1000ms 内存限制: 131072kB 描述 对于一个2N走道。现在用1*2,2*2铺满有多少种不同的方式。 下图是一个217走道的某种法。 输入 整个测试有多组数据,请做到文件底结束。每给出一个数字N,0 <= n <= 250 输出 如题 样例输入 2 8 12 100 200 样例输出 3 171 2731 8451004001521529343311354...

ffsdfg的博客 448

对于一个 2 N 走道。现在用 1×2,2×2铺满有多少种不同的方式。 输入格式 一个数字 N,0≤n≤250。 输出格式 方案数。(对 100007 取模)。 输出时每末尾的多余空格,不影响答案正确性 样例输入1 2 样例输出1 3 样例输入2 8 样例输出2171 思路特别简单就是动态规划 做一下笔记 #include<bits/stdc++.h> using namespace std; const int MAXN=251; const int MOD=1000

xlrll的博客 1309

9273:PKU2506Tiling2种解法递归和递推)

9273:PKU2506Tiling 总时间限制: 2000ms 单个测试点时间限制: 1000ms 内存限制: 131072kB 描述 对于一个2N走道。现在用1*2,2*2铺满有多少种不同的方式。 下图是一个217走道的某种法。 输入 整个测试有多组数据,请做到文件底结束。每给出一个数字N,0 &lt;= n &lt;= 250 输出 如题 ...

Harington的博客 3350

NOI / 2.3基本算法之递归变递推 9273:PKU2506Tiling 线性dp

当n>3时,1*2横放,有f(n-2)种,1*2竖放,有f(n-1)种,2*2,有f(n-2)种,所以。使用1*2横放,这样会占用掉这一和下一,因此当前和下一设方式就确定了,剩下的就是2(N-2)走道需要设,即f(n-2)种方式。因此,对于每一,我们都有三种选择,所以总的设方式就是这三种选择的总和,即f(n)=f(n-1)+2*f(n-2)。使用2*2设,这样会占用掉这一和下一,剩下的就是2(N-2)走道需要设,即f(n-2)种方式。对于一个2N走道

2303_79132118的博客 502

动态规划经典问题1

1.Pell数 计蒜客T1207 #include <iostream> #include <bits/stdc++.h> using namespace std; int dp[1000005]; int main() { int t,k; dp[1] = 1; dp[2] = 2; cin >> t; whi...

92377 1710

PKU 2506 Tiling(递推+高精度||string应用)

题目大意:原题链接有2×12×2两种规格的地板,现要拼2×n的形状,共有多少种情况,首先要做这道题目要先对递推有一定的了解。解题思路:1.假设我们已经好了2×(n-1)的情形,则要2×n则只能用2×1的地板2.假设我们已经好了2×(n-2)的情形,则要2×n则可以选择12×2或两个2×1,故可能有下三种法 其中要注意到第三个会与2×...

aixiaqin3479的博客 238
上一篇: 汉诺塔问题
下一篇: 饕餮纹问题
MaydayMerlin
博客等级 码龄3年 346粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值