zoukankan      html  css  js  c++  java
  • ZROI WC Round1 题解

    ZROI WC Round1 题解

    Problem A

    题意

    一个 (n imes m) 格子图,一个人从左上角出发,每次向右或者向下走一格,方法如下:

    • 如果他在最下面一排,那么他会往右行走。如果他在最右边一排,他会往下行走。
    • 否则他看下面和右边的数字那个更大,他会选择一个更大的格子走过去。如果碰到两个相同的格子,那么他会往右走。

    现在给每个格子填上一个 (0 sim S) 之间的数,要求这个人这个格子图上从左上走到右下经过的格子和恰好是 (S),求有多少个不同的格子图满足条件

    (1 leq n,m leq 2500,1 leq S leq 100)

    题解

    一个显然的 ( ext{dp})(f[i][j][k]) 表示当前走到 ((i,j)) 这个格子,经过的格子的权值和是 (k) 的方案数

    然后可以枚举下一步向右还是向下和格子上的数,做到 (O(n^4)),可以得到 (60)

    考虑怎样化简状态,首先发现,对于一条路径,我们只需要考虑它接触右边或者下边之前的部分,因为一旦它在最下面一排或者最右面一列,就必须向一个方向一直走,并且要求这一部分加上之后总和是 (S),这一部分可以用 ( ext{dp}) 预处理。

    那么把一条从左上到右下的路径定位在第一次走到右边界或者下边界的位置,发现对于两条路径,如果他们对应的位置相同,他们可以认为是等价的。原因如下:

    不难发现一条路径所能影响到的格子是路径长度的两倍,即每走一格之前都比较一次,影响两个格子

    对于对应点相同的两条路径,他们向右走的次数和向下走的次数也相同,所以影响到的格子数相同,并且每次比较时右边大的数量和下边大的数量都分别相同,所以我们可以移动其中一条路径的一些格子,把它变成另一条路径。

    那么我们考虑枚举对应的位置,不妨设当前枚举到右边界,结束位置为 ((i,m)),不难发现向右走 ((m-1)) 次,向下走 ((i-1)) 次,比较次数为 ((m+i-2)),经过的格子数是 ((m + i - 1 + m + i - 2 + n - i)) (包含了最后一段的格子数),不影响到的格子就是 (n imes m) 减去上面的式子,所有不影响到的格子都可以填任意数,然后枚举所有向右走的和以及向下走的和,( ext{dp}) 预处理出向右走 (i) 次,和为 (j) 的方案数,向下走 (i) 次,和为 (j) 的方案数,综合算一下即可,复杂度 (O(nS^2))

    Review

    考场上我想到了找对应点并且把路径化归成 (O(n)) 条本质不同的路径,但是在处理向右向下次数的时候遇到了问题,其实就是我没有发现对应点相同的路径向右向下次数分别相同

    Problem B

    我自己的题解

    Problem C

    题意

    有一个 (n) 个点 (m(m≤n+15)) 条边的无向连通图,求这个图的简单环的个数。简单环指不经过同一个节点两次的环。

    题解

    注意到非树边很少,所以可以把非树边拎出来建虚树,然后爆搜,然后惊人地发现过了。。。

    事实上正解就是缩图之后爆搜。。。

    考试的时候因为明显认为爆搜搜不了就没写虚树。。。

    Review

    要大胆地爆搜

  • 相关阅读:
    2w字 + 40张图带你参透并发编程!
    完了,这个硬件成精了,它竟然绕过了 CPU...
    一文详解 Java 并发模型
    详解匈牙利算法与二分图匹配
    机器学习 | 详解GBDT在分类场景中的应用原理与公式推导
    Python | 浅谈并发锁与死锁问题
    LeetCode 91,点赞和反对五五开,这题是好是坏由你来评判
    LeetCode 90 | 经典递归问题,求出所有不重复的子集II
    【Azure DevOps系列】什么是Azure DevOps
    MSIL入门(四)之委托delegate
  • 原文地址:https://www.cnblogs.com/wawawa8/p/10275104.html
Copyright © 2011-2022 走看看