问题描述
X国的一段古城墙的顶端可以看成 2*N个格子组成的矩形(如下图所示),现需要把这些格子刷上保护漆。
你可以从任意一个格子刷起,刷完一格,可以移动到和它相邻的格子(对角相邻也算数),但不能移动到较远的格子(因为油漆未干不能踩!)
比如:a d b c e f 就是合格的刷漆顺序。
c e f d a b 是另一种合适的方案。
当已知 N 时,求总的方案数。当N较大时,结果会迅速增大,请把结果对 1000000007 (十亿零七) 取模。

你可以从任意一个格子刷起,刷完一格,可以移动到和它相邻的格子(对角相邻也算数),但不能移动到较远的格子(因为油漆未干不能踩!)
比如:a d b c e f 就是合格的刷漆顺序。
c e f d a b 是另一种合适的方案。
当已知 N 时,求总的方案数。当N较大时,结果会迅速增大,请把结果对 1000000007 (十亿零七) 取模。
输入格式
输入数据为一个正整数(不大于1000)
输出格式
输出数据为一个正整数。
样例输入
2
样例输出
24
样例输入
3
样例输出
96
样例输入
22
样例输出
359635897
这道题网上已经有AC的代码,但是我用了另一个思路来解这道题,所以记录一下,跟大家一起交流学习
动态规划的题目关键就是找出递推关系,怎么从 n 推到 n+1
这里先介绍几个我自己想的名词:零端,双端,单同,单异
根据最右边的边缘包含几个端点,先分为零端(没有端点),单端(单个端点),双端(两个端点)
其中,单端又根据 相对点跟这个端点有没有连线,分为单同(有连线)和单异(没连线)
具体看图
由上图我们可以清晰得看到:
1个零端可以产生2个零端(这里以n=2递推到n=3作为例子)
1个双端可以产生2个双端和4个单同
。。。。。。
所以 (a,b,c,d)->( 2a+2c, 2b, 4b+2c+2d, 2c) 就是我们要的递推式, 再一个求和取模就是答案了
比如当n=2时候 ,24种方案里面有4个零端,4个双端,8个单同,8个单异
所以(a,b,c,d)=(4,4,8,8) -> (2a+2c,2b,4b+2c+2d,2c)=(24,8,48,16)
所以n=3方案数有 24+8+48+16=96
直接上代码
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner s=new Scanner(System.in);
int n=s.nextInt();
long []g=new long[]{4,4,8,8};
for(int i=0;i<n-2;i++)
g=f(g);
System.out.println((g[0]+g[1]+g[2]+g[3])% 1000000007);
}
private static long[] f(long[] g) {
return new long[] { (2 * g[0] + 2 * g[2]) % 1000000007, (2 * g[1]) % 1000000007,(4 * g[1] + 2 * g[2] + 2 * g[3]) % 1000000007, (2 * g[2]) % 1000000007 };
}
}
在这里也贴一下之前已经有的代码,供大家交流学习 :点击打开链接
之前网上的代码大抵都是这个思路,也全部能AC