2010 华农 G 题,,组合,容斥原理 数据小的话可以DP 但是数据很大

本文探讨了一个涉及大量数据的路径寻找问题。首先介绍了使用组合数计算无障碍物时的总路径数,随后提出了针对存在障碍物时利用容斥原理计算路径的方法,并引入了JULY的高效算法,该算法通过路径树的方式有效减少了计算量。

这是我们悲哀的一题,,没考虑数据量就用DP 开题了结果返回运行错误,,几番检查,,还是运行错误,到最后也没做出来

这道题数据量大,,用简单的数组记录DP 会超时

当时有想到要先忽略障碍求出总数再减去障碍物的路线

可是如何求障碍物的路线,,。特别是多个障碍物之间可能存在相同的路线。。。鸭子问我的时候我回答不上来

现在想想,,这个就是解题的突破点

 

现在给出我的粗糙的想法

题意,给出(n,m)的长方形。从(0,0)走到(N,M);

1.求出忽略障你碍物的总数。用组合数就可以得 F(N,M)=(N     )

                          ( N+M)

2求通过障碍物的路线

假设只有一个障碍物 在(X,Y)

则路线为 S=F(X,Y)*F(N-X,M-Y);(前后的路线相乘)

对于多个障碍物。可以用容斥原理

 

假设有三个障碍物(进行排序先)(X1,Y1,X2,Y2,X3,Y3)

第一个障碍物A=F(X1,Y1)*F(N-X1,M-Y2);

第二个障碍物B=F(X2,Y2)*F(N-X2,M-Y2);

第三个障碍物C=F(X3,Y3)*F(N-X3,M-Y3);

第一,二障碍物的共同路线AB=F(X1,Y1)*F(X2-X1,Y2-X1)*F(N-X2,M-Y2);

第一,三障碍物的共同路线AC=F(X1,Y1)*F(X3-X1,Y3-X1)*F(N-X3,M-Y3);

第二,三障碍物的共同路线BC=F(X2,Y2)*F(X3-X2,Y3-X2)*F(N-X3,M-Y3);

第一。二。三障碍物的共同路线ABC=F(X2,Y2)*F(X2-X1,Y2-X1 )*F(X3-X2,Y3-X2)*F(N-X3,M-Y3);

所以总的通过障碍物的路线为S=A+B+C-AB-BC-AC+ABC;

由于最多只有10个障碍物 所以运算量为 2^10*F()=1024*F()、而F()可以在预处理先做出来的啦,,

明显,看了july 大牛的做法后,,我感觉到自己太多太多的不足

最后再给出JULY 大牛的精辟算法

同样是用总数-障碍物
 算起点到每个障碍点的路径树first(i)(期间不会经过其它障碍点)
 总数-所有的first(i)*这点到终点的路径树
first(i)= 起点到这点i的路径数-它前面每个first(j)*j到i全部路径数

其实就是把问题转化为多个相同的子问题,都有相同的结构。消除了后效性

给个实例哦

第一个障碍物A=F(X1,Y1)

第二个障碍物B=F(X2,Y2)-( A*F(X2-X1,Y2-X1) );

第三个障碍物C=F(X3,Y3)-(A*F(X3-X1,X3-X1)+B*F(X3-X2,Y3-Y2));

S=F(N,M)-A*F(N-X1,M-Y1)-B*F(N-X2,M-Y2)-C*F(N-X3,M-Y3)

嘻嘻,,简单很多呢,,不愧是大牛啊。。

 

 

 

转载于:https://www.cnblogs.com/gdutbean/archive/2010/04/07/1706720.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值