CF1209E2 Rotate Columns (hard version)

CF1209E2 Rotate Columns (hard version)。

这道题是用了贪心和状压 dp。

首先这道题需要一个贪心,就是不是每一个列都有用,只需要选最大值前 nn 大的列,因为 nn 比 mm 小太多了。

然后再进行状压 dp。

fi,jf_{i,j} 表示现在到了第 ii 列,然后行的填补状态为 jj。

然后转移过程中需要用到的 wsw_s 表示列的位移可以任意选择,对于行的集合为 ss 的能做出的最大贡献。

转移方程式:dp[i][j] = max(dp[i-1][j], dp[i-1][k] + w[k^j] for all k⊆j)。

总结一下,这里的思路关键就是我们不知道这一行需要哪一列做最大值,所以要枚举每一列加入对哪些行做出贡献,相当于枚举对应关系。

看上去十分暴力。

CF1922F Replace on Segment

CF1922F Replace on Segment。

注意细节,不要打太快然后打错字符。

C++
状态压缩 dp 
看到 包不包含 这种东西,可以用 0/1 表示,也可以分两个数组 
f[l][r][j][1] 表示在 l 到 r 中都为 j 的最小代价 
f[l][r][j][0] 表示在 l 到 r 中都不为 j 的最小代价 


f[l][r][j][1] = f[l][r][j][0] + 1
f[l][r][j][0] = f[j][r][k][0] + 1 (k != j)

f[l][r][j][1] = f[l][mid][j][1] + f[mid+1][r][j][1]
f[l][r][j][0] = f[l][mid][j][0] + f[mid+1][r][j][0]