欢迎光临散文网 会员登陆 & 注册

DP入门_关于方格问题_P1002/P1004

2023-07-22 21:34 作者:DiLinging  | 我要投稿

D(ynamic) P(rogramming)

https://zhuanlan.zhihu.com/p/365698607

可以参考

然后针对方格问题,如 P1002

先拿斩马刀

给他马一刀

图中未标明坐标,请自行从图中0开始脑部.图中方格实际为原图的坐标点,即图中0所在位置为(0,0)


简单地,我们得到以下事实:

通往任意一点的路线数量等于相邻两点数量的和.

(只能由这两点到这一点,既然走到这两点的路线数是一定的,那走到这个点自然不会变,只是在原有路线后加了一个点而已,类似于1+1+....)

也就是

抽象函数立大功(

也就是图中表示的两个箭头:上面和左边加起来就等于这一格的数字

有点像杨辉三角

其他几个条件也很简单:

边界:x或y中有一个为0,也就是坐标边界,那必然为1(图中给出),因为除了直线无路可走

最优子结构:就是左边和上面的数字和

重叠子问题:

如果直接设定边界f(xy = 0) = 1,则会发生和例题中递归方法一样的后果:
f(2,1)->f(1,1)+f(2,0)

f(1,2)->f(1,1)+f(0,2)

f(1,2) & f(2,1):HXD咱们一起走

所有数字将从1开始累加,显然,时间复杂度很高

解决办法也很简单,从已知入手,一点点叠加,如图所示.从左上角开始而不是从右下角反推

注意在这么推的时候,马所控制的点无条件改为0即可,因为不可到达

Code!
看不清想办法,都是标准字体,重新放大损失很小,自己查看原图什么的,电脑屏幕就这么点大了

我知道你很急,但你先别急  (一会有你急的)

常规开局,如果用万能库<bits/std++>也行,快读快写什么的当然更好,这里当个原始人(简洁!(bushi))

声明变量和函数

注意:只有全局变量会被初始化为默认值0,局部变量将会是随机数,是直接接手的原来的内存而没有调整.这一点需要有所注意

输入数据,没啥好说的,等效于cin>>Bx>>By....这里为了对称美观

Coordinate_System:坐标系

+1是为了直接取Bx,By方便,开long long 是为了防止数据量过大爆掉

Homo特有的无意义初始化

看不到..

((i == Mx-2 || i == Mx+2) && (j == My-1 || j == My+1)) || ((i == Mx-1 || i == Mx+1) && (j == My-2 || j == My+2)) || (i == Mx && j == My)

这坨很长,但很简单:判断是不是马所控制的九个点,这里只是傻乎乎得全列出来了而已

init相关的几句是为了:如果初始化的路上有一个点是0,那后面的点必然全是0如

11111110(此时init为了)00000


一模一样的y方向,不用看了,x改y就能跑


   

重头戏来了,公式熟悉吗,就是那个状态转移方程!(if内是那一坨判断🐎的玩意)

输出,结束 (原代码里还有一坨是遍历这个二维数组的,对解题没啥用)

对于一个15*15且没有阻碍的方格,按照规定,有 155117520 种走法,直逼16E,再扩大一点int就会爆炸了.

P1004?累了,待会再写....


DP入门_关于方格问题_P1002/P1004的评论 (共 条)

分享到微博请遵守国家法律