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

这是我们悲哀的一题,,没考虑数据量就用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)

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

 

 

 

你可能感兴趣的:(dp)