这是我们悲哀的一题,,没考虑数据量就用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)
嘻嘻,,简单很多呢,,不愧是大牛啊。。