zoukankan      html  css  js  c++  java
  • 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)

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

  • 相关阅读:
    c# winform 读取图片列表
    C# 枚举显示中文
    onenote网页版如何打开链接弄到客户端
    the error code is 2203
    unknown software exception
    无法读取配置节“protocolMapping”,因为它缺少节声明
    oracle 索引失效原因
    向 mysql 插入汉字时报错 Incorrect string value: 'xE6x9BxB9xE5x86xAC...' for col....
    (二)Linux——Linux常用指令
    (一)Linux——Linux基本概念
  • 原文地址:https://www.cnblogs.com/gdutbean/p/1706720.html
Copyright © 2011-2022 走看看