题意:给你一个2*n 的格子,问你任选一个起点走相邻的格子(对角也算),不能走重复的格子,问你把格子走满的总数 % 1000000007,
解题思路: 这是一个经典的dp问题,主要在于把他简化为 ,只从边上的格子走,能有多少种方法填满。
解题代码:

1 // File Name: first.c 2 // Author: darkdream 3 // Created Time: 2014年03月07日 星期五 19时57分50秒 4 5 #include<stdio.h> 6 #include<string.h> 7 #include<stdlib.h> 8 #include<time.h> 9 #include<math.h> 10 #define M 1000000007 11 long long f[2000]; 12 long long P(int n) 13 { 14 if(n == 0 ) 15 return 1; 16 if(n == 1 ) 17 return 2; 18 long long temp = P(n/2) % M ; 19 if(n % 2 == 0 ) 20 return temp * temp % M ; 21 return temp *temp * 2 % M; 22 } 23 int main(){ 24 f[1] = 2; 25 f[2] = 12; 26 for(int i = 3;i <= 1000 ;i ++) 27 f[i] = 2*(f[i-1] + 2 * f[i-2]+ P(i-1)) % M; 28 int n ; 29 scanf("%d",&n); 30 if(n == 1 ) 31 { 32 printf("2 "); 33 return 0 ; 34 } 35 long long sum = 0 ; 36 sum = f[n]*2 %M; 37 for(int i = 2;i <= n-1 ; i ++) 38 { 39 sum += 2*(P(n-i)*f[i-1] + P(i-1)*f[n-i]) % M ; 40 sum = sum % M ; 41 } 42 printf("%lld ",sum); 43 return 0 ; 44 }