9.9集训

今天做了三个题 第一个是一个数位dp

吉哥系列故事——恨7不成妻 HDU - 4507

考虑三个条件

  • 整数某一位是7

简单,直接continue

  • 整数的每一位加起来的和是7的整数倍

维护一个sum即可

  • 这个整数是7的整数倍

当前枚举的数i,是第pos位,那么对求和的贡献就是\(i*10^{pos}\)

则对于一个pos位的与7无关的数X有\(X=( A\times10 ^ {pos}+B)^2\),A是你当前pos位枚举的值,B是一个子问题,展开得到\(A \times A \times 10 ^ 2 \times pos+2 \times A \times 10 ^{pos} \times B+B^2\)

第二个是壮压dp

P2704 [NOI2001]炮兵阵地

  • 空间不够

需要用滚动数组,因为是状态压缩两行,所以我们\(i\%3\)

  • 预处理

  • 考虑能放的条件

\(j\)&\((j<<1\;or\;2)\)

1位是左边一格子,2位是左边两格子

\(dp[L][S][i]\)表示当前状态是 S,上一行的状态是 L,当前考虑到了第 i 行

\(dp[L][S][i]=max(dp[L][S][i],dp[FL][L][i-1]+Sum[S])\) 这里 FL 表示上上行的状态,Sum[S] 表示当前状态 S 里面包含几个 1

  • 判断每个位置是不是山丘

只要把每一行的输入都转成一个二进制数(平原是 0,山丘是1),然后直接跟待判断的状态做一次位运算即可,就是 S&a[i],如果位运算结果不是零,说明有些位置放在了山丘上,也就是说当前状态不合法

第三个题是区间dp

P5336 [THUSC2016]成绩单

\(f[l][r][x][y]\)表示区间\([l,r]\)没取走的当中最大的是y,最小的是x的最小代价

考虑转移:

  • \([l,r-1]\)转移,就是把这个归为上一个的那一砣
  • 考虑枚举一个k,\(f[l][r][x][y] = min(f[l][r][x][y], f[l][k][x][y] + g[k + 1][r])\)
  • \(g[k+1][r]\)表示\(min(f[k+1][r][x][y])\)

还有个坑点:离散化

闲散时间D昨天树剖的bug

找到漏洞:

  • query函数没写return
  • 跳的时候是top数组
  • 两个dfs的名字不要互相引用
  • 读入字符和数字都有的时候,不能用快读!!!
  • 取最大值的时候,一定要给res赋极小值

如果出题人卡你负数,就凉了

Seating G

考虑down的时候

如果tag为0就要return