博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ2806 Square
阅读量:5171 次
发布时间:2019-06-13

本文共 1146 字,大约阅读时间需要 3 分钟。

题目描述

给定\(2*1\)\(2 * 2\)两种规格的地砖,请问\(2 * n\)的地面总共有多少种方法?

下面是铺满\(2*17\)的地面的示意图。

1558412-20190722164032121-816079659.png

输入输出格式

输入

多组数据,每组数据包括1行1个整数n,表示地面的长度。\((0\leq n \leq250)\)

输出

每组数据输出\(1\)\(1\)个整数,表示铺满\(n\)米地面的方法数。

思路

因为我们知道长度为\(i\)的矩阵只能由\(i-1\)\(i-2\)变来,又长度为一的矩阵的方法数为\(1\),长度为二的矩阵的方法数为\(3\),其中有一种相当于\(i-1\)的方法数,所以状态转移方程为\(dp[i][j]=dp[i-1][j]+dp[i-2][j]*2;\)

代码

#include
using namespace std; int dp[301][501]; //dp[i]用来存储第i列的结果,dp[i][0]存储长度int main(){ dp[1][0]=1; dp[1][1]=1; dp[2][0]=1; dp[2][1] = 3; for(int i=3;i<=300;i++){ int len=max(dp[i-2][0],dp[i-1][0]); for(int j=1;j<=len;j++) dp[i][j]=dp[i-1][j]+dp[i-2][j]*2; //按位加 dp[i][0]=max(dp[i-2][0],dp[i-1][0]); //取两个加数中较长的长度 for(int j=1;j<=dp[i][0];j++){ dp[i][j+1]+=dp[i][j]/10; //进位 dp[i][j]%=10; } while(dp[i][dp[i][0]+1]>0){ //更新高精度加法结果的位数 dp[i][0]++; dp[i][dp[i][0]+1]+=dp[i][dp[i][0]]/10; } } int n; while(cin>>n){ if(n==0) cout<<1<
=1;i--) cout<

转载于:https://www.cnblogs.com/xzj213/p/11226764.html

你可能感兴趣的文章
WAMP(Windows+Apache+Mysql+PHP)环境搭建
查看>>
golang调用c++的dll库文件
查看>>
知识点篇:7)企业标准体系制定要求
查看>>
php’s explode() 函数
查看>>
Spring AOP的实现思想之动态代理
查看>>
VSCode设置中文语言
查看>>
Kafka 几个实现细节
查看>>
UWP学习目录整理
查看>>
Centos7-安装Gradle4.10
查看>>
四则运算1
查看>>
Web API框架学习——消息管道(二)
查看>>
【转】请求处理机制其二:Django中间件的解析
查看>>
如何让Div层悬浮在Flash Object对象之上(转载)
查看>>
Visual Studio Code compile error - launch.json must be configured...
查看>>
【算法竞赛-入门经典】计算并输出1+2的值
查看>>
我们应该顶住压力
查看>>
对于大流量的网站,您采用什么样的方法来解决访问量问题?
查看>>
PCIE设备与HOST之间的地址转换
查看>>
Ambari 安装配置 MySql
查看>>
linux下工具exfs用法
查看>>