【HDOJ6146】Pokémon GO(DP,计数)

题意:一个2*n的矩阵,从任意一格出发,不重复且不遗漏地走遍所有格子,问方案数 mo 10^9+7

n<=10000

思路:因为OEIS搜出来的两个数列都是错误的,所以考虑DP

设B[i]为2*i的矩阵,从其中一个角开始走,走遍整个矩阵最后回到同一列的方案数

经打草稿+猜结论得到B[i]=2^(i-1)

设A[i]为2*i的矩阵,从其中一个角开始走,走遍整个矩阵不一定要回到同一列的方案数

推导后得A[i]=B[i]+2*A[i-1]+4*A[i-2]

因为有四个角,所以ANS=a[n]*4

继续考虑从中间开始走的方案数,可以先往左回来再往右,也可以先往右再往左

ANS=ANS+8*sigma(a[i-1]*b[n-i]+b[i-1]*a[n-i])

 1 const mo=1000000007;
 2 var a,b:array[1..10000]of int64;
 3     cas,v,i,n:longint;
 4     ans:int64;
 5 
 6 begin
 7  assign(input,'hdoj6146.in'); reset(input);
 8  assign(output,'hdoj6146.out'); rewrite(output);
 9  b[1]:=1;
10  for i:=2 to 10000 do b[i]:=b[i-1]*2 mod mo;
11  a[1]:=1; a[2]:=6;
12  for i:=3 to 10000 do a[i]:=(b[i]+2*a[i-1] mod mo+4*a[i-2] mod mo) mod mo;
13  readln(cas);
14  for v:=1 to cas do
15  begin
16   readln(n);
17   if n=1 then
18   begin
19    writeln(2);
20    continue;
21   end;
22   ans:=a[n]*4 mod mo;
23   for i:=2 to n-1 do
24    ans:=(ans+8*(a[i-1]*b[n-i] mod mo+b[i-1]*a[n-i] mod mo)) mod mo;
25   writeln(ans);
26  end;
27  close(input);
28  close(output);
29 end.
原文地址:https://www.cnblogs.com/myx12345/p/7401312.html