ZROI WC Round1 题解
ZROI WC Round1 题解
Problem A
题意
一个 \(n \times m\) 格子图,一个人从左上角出发,每次向右或者向下走一格,方法如下:
- 如果他在最下面一排,那么他会往右行走。如果他在最右边一排,他会往下行走。
- 否则他看下面和右边的数字那个更大,他会选择一个更大的格子走过去。如果碰到两个相同的格子,那么他会往右走。
现在给每个格子填上一个 \(0 \sim S\) 之间的数,要求这个人这个格子图上从左上走到右下经过的格子和恰好是 \(S\),求有多少个不同的格子图满足条件
\(1 \leq n,m \leq 2500,1 \leq S \leq 100\)
题解
一个显然的 \(\text{dp}\) 是 \(f[i][j][k]\) 表示当前走到 \((i,j)\) 这个格子,经过的格子的权值和是 \(k\) 的方案数
然后可以枚举下一步向右还是向下和格子上的数,做到 \(O(n^4)\),可以得到 \(60\) 分
考虑怎样化简状态,首先发现,对于一条路径,我们只需要考虑它接触右边或者下边之前的部分,因为一旦它在最下面一排或者最右面一列,就必须向一个方向一直走,并且要求这一部分加上之后总和是 \(S\),这一部分可以用 \(\text{dp}\) 预处理。
那么把一条从左上到右下的路径定位在第一次走到右边界或者下边界的位置,发现对于两条路径,如果他们对应的位置相同,他们可以认为是等价的。原因如下:
不难发现一条路径所能影响到的格子是路径长度的两倍,即每走一格之前都比较一次,影响两个格子
对于对应点相同的两条路径,他们向右走的次数和向下走的次数也相同,所以影响到的格子数相同,并且每次比较时右边大的数量和下边大的数量都分别相同,所以我们可以移动其中一条路径的一些格子,把它变成另一条路径。
那么我们考虑枚举对应的位置,不妨设当前枚举到右边界,结束位置为 \((i,m)\),不难发现向右走 \((m-1)\) 次,向下走 \((i-1)\) 次,比较次数为 \((m+i-2)\),经过的格子数是 \((m + i - 1 + m + i - 2 + n - i)\) (包含了最后一段的格子数),不影响到的格子就是 \(n\times m\) 减去上面的式子,所有不影响到的格子都可以填任意数,然后枚举所有向右走的和以及向下走的和,\(\text{dp}\) 预处理出向右走 \(i\) 次,和为 \(j\) 的方案数,向下走 \(i\) 次,和为 \(j\) 的方案数,综合算一下即可,复杂度 \(O(nS^2)\)
Review
考场上我想到了找对应点并且把路径化归成 \(O(n)\) 条本质不同的路径,但是在处理向右向下次数的时候遇到了问题,其实就是我没有发现对应点相同的路径向右向下次数分别相同
Problem B
见 我自己的题解
Problem C
题意
有一个 \(n\) 个点 \(m(m≤n+15)\) 条边的无向连通图,求这个图的简单环的个数。简单环指不经过同一个节点两次的环。
题解
注意到非树边很少,所以可以把非树边拎出来建虚树,然后爆搜,然后惊人地发现过了。。。
事实上正解就是缩图之后爆搜。。。
考试的时候因为明显认为爆搜搜不了就没写虚树。。。
Review
要大胆地爆搜
最新文章
- C# 动软生成器对应的Access数据库操作类DbHelperOleDb
- android 编译代码注意事项
- AS技巧合集「常用技巧篇」
- <;欧奈尔制胜法则—如何在股市中赚钱>;读书笔记
- mysql错误:“ Every derived table must have its own alias”(每个派生出来的表都必须有一个自己的别名)
- 什么是SQL注入式攻击
- js回调函数(callback)理解
- ArcGIS 10.0发布缓存地图服务(详细版)
- python之os
- uploadfy 图片/视频上传
- PHP-自定义数组-预定义数组-自定义函数-预定义函数
- 关于treeMap
- Android 如何将手机屏幕投影到 PC 屏幕上或者投影仪上做演示?
- Unexpected directive &#39;XXX&#39; imported by the module &#39;AppMoode&#39;
- 20145330 《网络对抗》 Web安全基础实践
- MobaXterm 错行,乱码
- leetcode-36-有效的数独
- JAVA中UDP使用
- HDU 1027 Ignatius and the Princess II(求第m个全排列)
- Hyper-V和vmware在虚拟机中安装xen总结