大致题意:现有两种方块(1X2,2X2),方块数量无限制。问用这两种方块填满2Xn的矩阵的填法有多少种。
分析:通俗点说,找规律。专业化一点,动态规划。
状态d[i],表示宽度为i的填法个数。
状态转移方程:d[0]=d[1]=1,i=0,1;
d[i]=d[i-1]+d[i-2]*2;
c或者c++写的话,先模拟下大数吧,java直接用大数类就行了。
c++
#include <iostream> #include <cstdio> #include <algorithm> using namespace std; struct BigInteger { int num[100]; int len; }; BigInteger add(BigInteger a,BigInteger b) { BigInteger c; c.len=0; int len=max(a.len,b.len); int left=0; for(int i=0; i<len; i++,c.len++) { int tmp=a.num[i]+b.num[i]+left; c.num[i]=tmp%10; left=tmp/10; } if(len==a.len) for(int i=len; i<b.len; i++,c.len++) { int tmp=b.num[i]+left; c.num[i]=tmp%10; left=tmp/10; } if(len==b.len) for(int i=len; i<a.len; i++,c.len++) { int tmp=a.num[i]+left; c.num[i]=tmp%10; left=tmp/10; } if(left) c.num[c.len++]=1; return c; } int main() { //freopen("in.txt","r",stdin); int n; BigInteger a,b,c; while(cin>>n) { if(n==0 || n==1) printf("1 "); else { a.num[0]=a.len=1; b.num[0]=b.len=1; c.len=0; for(int i=2; i<=n; i++) { c=add(add(a,a),b); a=b; b=c; } for(int i=c.len-1;i>=0;i--) printf("%d",c.num[i]); printf(" "); } } return 0; }
java
import java.math.BigInteger; import java.util.Scanner; public class Main { public static void main(String args[]) { int n; Scanner scanner = new Scanner(System.in); while (scanner.hasNext()) { n = scanner.nextInt(); BigInteger a = BigInteger.ONE; BigInteger b = BigInteger.valueOf(3); if (n == 1 || n == 0) System.out.println(a); else if (n == 2) System.out.println(b); else { BigInteger ans = BigInteger.ZERO; for (int i = 0; i < n - 2; i++) { ans = a.multiply(BigInteger.valueOf(2)).add(b); a = b; b = ans; } System.out.println(ans); } } } }