问题场景:
X国的一段古城墙的顶端可以看成 2*N个格子组成的矩形(如下图所示),现需要把这些格子刷上保护漆。
你可以从任意一个格子刷起,刷完一格,可以移动到和它相邻的格子(对角相邻也算数),但不能移动到较远的格子(因为油漆未干不能踩!)
比如:a d b c e f 就是合格的刷漆顺序。
c e f d a b 是另一种合适的方案。
当已知 N 时,求总的方案数。当N较大时,结果会迅速增大,请把结果对 1000000007 (十亿零七) 取模。
输入格式
输入数据为一个正整数(不大于1000)
输出格式
输出数据为一个正整数。
样例输入
2
样例输出
24
样例输入
3
样例输出
96
样例输入
22
样例输出
359635897
选择算法方式:
看完题目想用深搜,但是O(n*6^n)时间复杂度不允许。
然后果断选择用动态规划!
原因分析:
使用动态规划,可以大幅度降低时间复杂度(只对于这题,其实一般优化不大)
核心要点和思想:
ll a[1005];//从一个角的点出发,任何方向遍历得到的总路径数
ll b[1005];//从中间点出发,再次回到原来点的上面或者下面的总路径数
起点分两种情况:
- 从一个角的点出发:
分三种情况:
a[i - 1] * 2
2 * 2 * a[i - 2]
b[i]
(从中可以得到a b的动态方程:
a[i]=a[i - 1] * 2 +2 * 2 * a[i - 2]+b[i]
b[i]=b[i-1]
)
- 从中间的点出发:
从中间以左出发:
b[i]22a[n-i]
从中间以右出发:
b[n-i+1]22a[i-1]
所以
ans=4*a[N]+从中间的点的路径总数
额外注意的地方:
写到这里,调试小数据应该是没有问题的。但是提交还是错误:
根据题目,结果对 maxxx = 1000000007 取余
如果只对最后的结果取余。也可能会出错,尽可能对每一个涉及到变化的变量进行取余(其实会存在错误,但可以忽略不计,稍微大点的数据成指数增长变化)