动态规划 之 历届试题 格子刷油漆

这篇博客探讨了如何使用动态规划解决一种特殊的格子刷油漆问题,其中需要从古城墙的某个角落开始,按照特定规则刷漆。博主详细分析了选择动态规划的原因和核心思想,给出了状态转移方程,并特别指出在处理大数模运算时需要注意的细节。通过实例展示了动态规划在优化时间复杂度方面的优势,并提供了最终的解决方案。
摘要由CSDN通过智能技术生成

问题场景:

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];//从中间点出发,再次回到原来点的上面或者下面的总路径数

起点分两种情况:

  1. 从一个角的点出发:
    分三种情况:
    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]
)

  1. 从中间的点出发:
    从中间以左出发:
    b[i]22a[n-i]
    从中间以右出发:
    b[n-i+1]22
    a[i-1]

所以
ans=4*a[N]+从中间的点的路径总数




额外注意的地方:

写到这里,调试小数据应该是没有问题的。但是提交还是错误:
根据题目,结果对 maxxx = 1000000007 取余
如果只对最后的结果取余。也可能会出错,尽可能对每一个涉及到变化的变量进行取余(其实会存在错误,但可以忽略不计,稍微大点的数据成指数增长变化)

解决方案:


                
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值