Tiling_easy version(填2 x N的格子的种类)

E - Tiling_easy version

题目大意: 有一个大小是 2 x n 的网格,现在需要用2种规格的骨牌铺满,骨牌规格分别是 2 x 1 和 2 x 2,请计算一共有多少种铺设的方法。

一个简单的dp问题: dp[i+2]=dp[i+1]+2*dp[i]; 初始条件:dp[1]=1;dp[2]=3;

一开始没考虑清楚,把递推关系写成dp[i+2]=3*dp[i];

解释一下dp[i+2]=dp[i+1]+2*dp[i]

dp[i+2]相对于dp[i]正好多一个2x2的正方形,当前 i+1 个格子都填满后,则第i+2 个格子就确定了,而当前i个 都填满后,为了不与i+1 个格子都填满的方案重复,则还有两种方案可选,直接填2x2或填两个1x2(横着填)

  

/*
* Created:     2016年05月12日 15时24分05秒 星期四
* Author:      Akrusher
*
*/
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <deque>
#include <list>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <numeric>
#include <iomanip>
#include <bitset>
#include <sstream>
#include <fstream>
using namespace std;
#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=n-1;i>=a;i--)
#define in(n) scanf("%d",&(n))
#define in2(x1,x2) scanf("%d%d",&(x1),&(x2))
#define in3(x1,x2,x3) scanf("%d%d%d",&(x1),&(x2),&(x3))
#define inll(n) scanf("%I64d",&(n))
#define inll2(x1,x2) scanf("%I64d%I64d",&(x1),&(x2))
#define inlld(n) scanf("%lld",&(n))
#define inlld2(x1,x2) scanf("%lld%lld",&(x1),&(x2))
#define inf(n) scanf("%f",&(n))
#define inf2(x1,x2) scanf("%f%f",&(x1),&(x2))
#define inlf(n) scanf("%lf",&(n))
#define inlf2(x1,x2) scanf("%lf%lf",&(x1),&(x2))
#define inc(str) scanf("%c",&(str))
#define ins(str) scanf("%s",(str))
#define out(x) printf("%d\n",(x))
#define out2(x1,x2) printf("%d %d\n",(x1),(x2))
#define outf(x) printf("%f\n",(x))
#define outlf(x) printf("%lf\n",(x))
#define outlf2(x1,x2) printf("%lf %lf\n",(x1),(x2));
#define outll(x) printf("%I64d\n",(x))
#define outlld(x) printf("%lld\n",(x))
#define outc(str) printf("%c\n",(str))
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
#define mem(X,Y) memset(X,Y,sizeof(X));
typedef vector<int> vec;
typedef long long ll;
typedef pair<int,int> P;
const int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};
const int INF=0x3f3f3f3f;
const ll mod=1e9+7;
ll powmod(ll a,ll b) {ll res=1;a%=mod;for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
const bool AC=true;

ll dp[35];
int main()
{
    int t,n;
    in(t);
    dp[1]=1ll;dp[2]=3ll;
    rep(i,1,31){
      dp[i+2]=2*dp[i]+dp[i+1];
    }
    while(t--){
        in(n);
        outlld(dp[n]);
    }
    return 0;
}
时间: 2024-10-11 00:46:09

Tiling_easy version(填2 x N的格子的种类)的相关文章

hdu 2501 Tiling_easy version 递推

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2501 题目分析:已知有2*1,2*2,两种型号的瓷砖,要求铺满2*n的格子有多少种方法.可以考虑最左边一列的铺法,竖着铺的话,右边为f(n-1),只有一种铺法:横着铺的话,可以用一块2*2或者两块2*1的横铺, 右边为f(n-2), 有两种. 故递推公式为:f(n) = f(n-1) + 2*f(n-2) /*Tiling_easy version Time Limit: 1000/1000 MS

(hdu step 3.1.5)Tiling_easy version(求用2*1、2*2两种骨格铺满2*n的网格的方案数)

在写题解之前给自己打一下广告哈~..抱歉了,希望大家多多支持我在CSDN的视频课程,地址如下: http://edu.csdn.net/course/detail/209 题目: Tiling_easy version Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 515 Accepted Submission(s): 447   Prob

HDU - 2501 - Tiling_easy version (简单递推关系!!)

Tiling_easy version Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 5516    Accepted Submission(s): 4347 Problem Description 有一个大小是 2 x n 的网格,现在需要用2种规格的骨牌铺满,骨牌规格分别是 2 x 1 和 2 x 2,请计算一共有多少种铺设的方法

Tiling_easy version

Tiling_easy version 思路:关于dp这种东西,有一点必须要想明白,就是状态与状态之间的转换关系,就比如说要求5个骨牌的方案数,因为有两种骨牌,那么可以用dp[3]+两个横着的骨牌或者一个2*2的骨牌,或者是dp[4]+一个竖着的1*2骨牌来构成,那么递推的公式就是dp[5]=dp[3]*2+dp[4] 代码: // Created by CAD on 2019/10/10. #include <bits/stdc++.h> using namespace std; int d

用VSCode插件来一键填满Github的绿色格子吧-AutoCommit

autoCommit 一个用于Git自动commit的VSCode插件,它可以用来补充之前忘记提交commit,帮助你把首页的绿色格子填满. 使用效果 使用本插件来控制commit次数. 如下图,你甚至可以规划一下commit次数,然后画出图形, 天空才是你的极限. 功能特性 选择多个日期范围:一次操作即可提交不同日期commit 控制每个日期的commit次数: 可以用它来控制绿色格子的颜色,了解commit次数与颜色 随机commit次数:随机commit次数让我们的提交看起来更加逼真. 取

Hdoj 2501.Tiling_easy version 题解

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

1504071639-hd-Tiling_easy version

 Tiling_easy version Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 5910    Accepted Submission(s): 4646 Problem Description 有一个大小是 2 x n 的网格,现在需要用2种规格的骨牌铺满,骨牌规格分别是 2 x 1 和 2 x 2,请计算一共有多少种铺设

20135234马启扬 实验三:敏捷开发与XP实践

实     验    报     告 课程:Java 班级: 1352    姓名:马启扬    学号:20135234 成绩:              指导教师:娄嘉鹏    实验日期:2015.6.2 实验密级:          预习程度:          实验时间:17:00~23:00 仪器组次:34        必修/选修:选修      实验序号:02 实验名称:敏捷开发与XP实践 实验仪器: 名称 型号 数量 计算机 DELL 1 实验楼   1 实验内容: 1. XP基础

【解题报告】2014ACM/ICPC上海赛区现场赛B

唉  谷歌出的神题,差点爆零了...三小时终于A掉 B题 题目大概是说从左上角的点出发,经过某路线最后回到原点,求每个格子被路线包含的圈数的平方和. 首先可以知道,对于某个格子来说,从该格子的任意一个方向划一条射线,路径穿过该射线的次数就等于该格子被包含的圈数(正穿和反穿抵消). 然后开一个100w的数组保存每个格子的上面那条线被向右走过的次数.模拟出路径,然后填满数组.求格子的圈数就等于这个格子和它上面所有格子里面填的值的和.然后全部平方加起来就可以了. 有一个点就是可以把高和宽中较短的那一条