C++编程题:帮我理解一下这个代码

ProblemDescription有一个大小是2xn的网格,现在需要用2种规格的骨牌铺满,骨牌规格分别是2x1和2x2,请计算一共有多少种铺设的方法。Input输入的第... Problem Description
有一个大小是 2 x n 的网格,现在需要用2种规格的骨牌铺满,骨牌规格分别是 2 x 1 和 2 x
2,请计算一共有多少种铺设的方法。

Input
输入的第一行包含一个正整数T(T<=20),表示一共有
T组数据,接着是T行数据,每行包含一个正整数N(N<=30),表示网格的大小是2行N列。

Output
输出一共有多少种铺设的方法,每组数据的输出占一行。

Sample Input
3
2
8
12

Sample Output
3
171
2731
代码:
#include <iostream>

using namespacestd;
intdig[40];
int main()
{
dig[1]=1;
dig[2]=3;
for(inti=3;i<=30;i++)------------》特别这里
dig[i]=dig[i-1]+2*dig[i-2];-------------》
intn;
while(cin>>n)
{
while(n--)
{
intm;
cin>>m;
cout<<dig[m]<<endl;
}
}
return0;
}
展开
 我来答
KummerWu
2013-05-01 · TA获得超过694个赞
知道小有建树答主
回答量:378
采纳率:0%
帮助的人:418万
展开全部

首先分析一下这个题目,题目分析清楚了,代码也就清楚了。

我们假设摆2*N块砖有dig[n]中方法,根据下面的分析,我们可以dig[n]递归到dig[n-1]和dig[n-2]上,dig[n]可以分解为上图的三种摆法:

1. 最后选一块2*1的砖,竖着放:  前面2*(N-1)块砖,一共有dig[n-1]种摆法

2. 最后选一个2*2的砖,(横竖放都一样):前面有2*(N-2)块砖,一共有dig[n-2]种摆法

3. 最后选一块2*1的砖,横着放(横着放的2*1的砖必然是成对出现的):前面有2*(N-2)块砖,一共有dig[n-2]种摆法

所有,2*N的总摆法数,就是一个递归计算的过程,

dig[n]=dig[n-1]+dig[n-2]+dig[n-2] = dig[n-1]+2*dig[n-2];

zhou2214
2013-05-01 · TA获得超过706个赞
知道小有建树答主
回答量:495
采纳率:0%
帮助的人:511万
展开全部
问题虽然简单,但是蕴含了动态规划的思想。

比如 假如长度是N ,那么可以将问题缩小成 1 : N-1长度 加一块 竖着的 2乘1 ;
2: N-2长度 加一块 2乘2
3:N-2长度 加两块横着的1乘2

通过上面三种情况,可以从低维度(N等1或2) 依次推出其他的维度情况。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
AK丿血屮染
2013-05-01 · TA获得超过246个赞
知道小有建树答主
回答量:624
采纳率:0%
帮助的人:285万
展开全部
for(inti=3;i<=30;i++) 从i=3 开始 一直执行到29 到 i=30 跳出循环

dig[i]=dig[i-1]+2*dig[i-2] 从=3开始 把d[i]的前一项加上d[i]的第前二项的2位赋给d[i],举列:i=3

d[3]=d[2]+2*d[1]=5 一直执行到29 到 i=30 跳出循环
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式