AtCoder Regular Contest 058

本文介绍了三道算法竞赛题目,涉及暴力求解、组合数学和状态压缩动态规划的解题思路。C题通过暴力枚举解决;D题利用组合数学的容斥原理计算;E题采用状态压缩DP,处理小规模数据的约束。文章深入浅出地解析了算法应用。
摘要由CSDN通过智能技术生成

比赛链接

C - Iroha’s Obsession

300 300 300分 模拟

直接暴力加就行

代码

D - Iroha and a Grid

400 400 400分 组合数学

考虑容斥,矩阵 ( n , m ) (n,m) (n,m)考虑从坐上走到右下的所有方式为 C ( n + m − 2 , n − 1 ) C(n+m-2,n-1) C(n+m2,n1),现在我们只需要减去路线中经过左下角的方案即可,所以我们只需要枚举左下角的第一行,假设当前枚举到 ( x , y ) (x,y) (x,y),计算从 ( 1 , 1 ) (1,1) (1,1) ( x , y ) (x,y) (x,y)的方案,让后算一下 ( x , y ) (x,y) (x,y) ( n , m ) (n,m) (n,m)方案,两个方案乘起来即可,注意算 ( 1 , 1 ) (1,1) (1,1) ( x , y ) (x,y) (x,y)方案的时候需要减去一个前缀。

代码

E - Iroha and Haiku

700 700 700分 状压dp

700 700 700分做起来也费劲,还是自己擅长的状压dp,属实是菜。

题意有点复杂,稍微解释一下

你有一个长度为 n n n的数组,每个位置元素的值是 [ 1 , 10 ] [1,10] [1,10]之间任意数,给你 X , Y , Z X,Y,Z X,Y,Z,让后现在让你求有多少个数组不存在四个整数 x , y , z , w x,y,z,w x,y,z,w,满足:

  • a x + a x + 1 + . . . + a y − 1 = X a_x+a_{x+1}+...+a_{y-1}=X ax+ax+1+...+ay1=X
  • a y + a y + 1 + . . . + a z − 1 = Y a_y+a_{y+1}+...+a_{z-1}=Y ay+ay+1+...+az1=Y
  • a z + a z + 1 + . . . + a w − 1 = Z a_z+a_{z+1}+...+a_{w-1}=Z az+az+1+...+aw1=Z

对答案模上 1 e 9 + 7 1e9+7 1e9+7

3 ≤ n ≤ 40 , 1 ≤ X ≤ 5 , 1 ≤ Y ≤ 7 , 1 ≤ Z ≤ 5 3\le n\le 40,1\le X\le 5,1\le Y\le 7,1\le Z\le 5 3n40,1X5,1Y7,1Z5

依旧考虑用总方案减去不合法的,总方案显然是 1 0 n 10^{n} 10n,现在我们求不合法的。

考虑到 X , Y , Z X,Y,Z X,Y,Z都很小,我们可以使用状压,维护一个后缀,如果存在一个后缀和等于 x x x,那么我们将二进制的 1 < < ( x − 1 ) 1<<(x-1) 1<<(x1)置为 1 1 1,由于 m a x ( X + Y + Z ) = 17 max(X+Y+Z)=17 max(X+Y+Z)=17,所以后缀的二进制最长也就 17 17 17位,每次只需要检查以下二进制是否 ( 1 < < ( Z − 1 ) ) , ( 1 < < ( Z + Y − 1 ) ) , ( 1 < < ( X + Y + z − 1 ) ) (1<<(Z-1)),(1<<(Z+Y-1)),(1<<(X+Y+z-1)) (1<<(Z1)),(1<<(Z+Y1)),(1<<(X+Y+z1))这几位是否都为 1 1 1即可,可以用二进制操作方便得到。

考虑怎么给二进制都加上一个数 x x x,显然将所有数左移 x x x即可, b i t s e t bitset bitset经典操作了。

具体实现就写个 f [ i ] [ j ] f[i][j] f[i][j]代表到了第 i i i个位置,不算 i i i的时候后缀为 j j j的方案数,复杂度 O ( n ∗ ( 1 < < 17 ) ∗ 10 ) O(n*(1<<17)*10) O(n(1<<17)10)

代码

F - Iroha Loves Strings

1500 1500 1500分 背包 + 扩展 k m p kmp kmp // bitset优化乱搞dp

确实大大超出了我能力范围了,看了半天洛谷题解算是懂了点皮毛,但是不想写,咕咕咕。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值