题意:给你一个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\n");
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\n",sum);
43 return 0 ;
44 }
View Code

 

posted on 2014-03-07 21:42  dark_dream  阅读(987)  评论(0编辑  收藏  举报