Tiling a Grid With Dominoes
Time Limit: 1000/500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 436 Accepted Submission(s): 338
Problem Description
We wish to tile a grid 4 units high and N units long with rectangles (dominoes) 2 units by one unit (in either orientation). For example, the figure shows the five different ways that a grid 4 units high and 2 units wide may be tiled.
Write a program that takes as input the width, W, of the grid and outputs the number of different ways to tile a 4-by-W grid.
Write a program that takes as input the width, W, of the grid and outputs the number of different ways to tile a 4-by-W grid.
Input
The first line of input contains a single integer N, (1 ≤ N ≤ 1000) which is the number of datasets that follow.
Each dataset contains a single decimal integer, the width, W, of the grid for this problem instance.
Each dataset contains a single decimal integer, the width, W, of the grid for this problem instance.
Output
For each problem instance, there is one line of output: The problem instance number as a decimal integer (start counting at one), a single space and the number of tilings of a 4-by-W grid. The values of W will be chosen so the count will fit in a 32-bit integer.
Sample Input
3 2 3 7
Sample Output
1 5 2 11 3 781
Source
递推公式:dp[i]=dp[i-1]+dp[i-2]*4+2*(dp[i-3]+dp(i-5).......)+3*(dp[i-4]+dp[i-6]..........);
ac代码
#include<stdio.h>
__int64 a[100000];
void fun()
{
int i;
a[0]=1;
a[1]=1;
a[2]=5;
for(i=3;i<=1000;i++)
{
int t1=i-3,t2=i-4;
a[i]+=a[i-1]+4*a[i-2];
while(1)
{
if(t1<0)
break;
a[i]+=2*a[t1];
t1-=2;
}
while(1)
{
if(t2<0)
break;
a[i]+=3*a[t2];
t2-=2;
}
}
}
int main()
{
int t,c=0;
fun();
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
printf("%d %I64d\n",++c,a[n]);
}
}