格子刷油漆---蓝桥杯练习

啊啊啊啊,动态规划永远滴神

题目描述

X 国的一段古城墙的顶端可以看成 2×N 个格子组成的矩形(如下图所示),现需要把这些格子刷上保护漆。

在这里插入图片描述

你可以从任意一个格子刷起,刷完一格,可以移动到和它相邻的格子(对角相邻也算数),但不能移动到较远的格子(因为油漆未干不能踩!)

比如:a d b c e f 就是合格的刷漆顺序。c e f d a b 是另一种合适的方案。

当已知 N 时,求总的方案数。当 N 较大时,结果会迅速增大,请把结果对 10^9+7 取模。

输入描述
输入数据为一个正整数(不大于 1000)。

输出描述
输出数据为一个正整数。

输入输出样例

输入

	2

输出

	24

思路

本来是用深度搜索来做这道题的,结果列数达到一定数量的时候,栈就溢出了,呜呜呜,只能用动态规划了

题目中说可以从任意的一个格子刷起,那么将分为两种情况

设a[n]代表n列从角开始刷的方案数量

设b[n]代表中间第n列开始刷到边界的方案数量

1、四个角刷起

分为三种情况
(1)、一列一列的刷
在这里插入图片描述
那么 a[n]=2*a[n-1]

(2)、两列两列的刷
在这里插入图片描述
那么a[n]=2 * 2 * a[n-2]

(3)、一列只刷一个
在这里插入图片描述
由于这种方案是由一边刷到另外一边,刷回来的路线由刷过去的路线决定,且唯一,所以用b[i]表示,由于每次有两种选择,那么b[i]=2b[i-1]

2、中间任意一块刷起

在这里插入图片描述
假如从E开始向右刷,右边刷完时结束位置必须是F,接着向左边刷,因为可以选择C或者D,那么是2*a[2]

方案总和=四个角+中间每列

a[n]=2 * a[n-1]+4 * a[n-2]+b[i]

sum=4 * a[n]+b[2]+…+b[n-1]

代码

import os
import sys

# 请在此输入您的代码

n=int(input())

a=[0 for i in range(n+1)]

b=[0 for i in range(n+1)]

a[1]=1
a[2]=6

b[1]=1
b[2]=2

MOD=10**9+7

for i in range(3,n+1):
    b[i]=(2*b[i-1])%MOD
    a[i]=(2*a[i-1]+b[i]+4*a[i-2])%MOD

sum=(4*a[n])%MOD

for i in range(2,n):
    sum=(sum+4*(b[i]*a[n-i]+b[n-i+1]*a[i-1]))%MOD
print(sum)

编码不易,有帮助的话点个赞支持一下吧

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值