首页 > 其他分享 >省选10. 动态规划

省选10. 动态规划

时间:2022-12-24 09:23:52浏览次数:65  
标签:10 frac 省选 S2 sum times leq 动态 dp

P3736 [HAOI2016]字符合并

考虑区间 dp + 状压 dp。

设 \(dp(l,r,s)\) 表示 \([l,r]\) 合并成 \(s\) 的最大分数。

如果 \(r-l+1=len\),那么合并后的长度一定是 \(len\bmod{(k-1)}\)。

于是可以考虑枚举 \(mid\),将 \([l,mid]\) 和 \([mid+1,r]\) 的区间合并,且要求枚举的 \(mid\) 满足将 \([mid+1,r]\) 合并后只剩一个字符。

最后如果,\(len\bmod{(k-1)}=0\),需要特殊处理全部合并的情况。

P4067 [SDOI2016]储能表

设统计大于 \(k\) 的异或和记为 \(f\),大于 \(k\) 的方案数记为 \(g\),答案为 \(f-k\times g\)。

\(f(i,a,b,c)\) 表示从高到低前 \(i\) 位是否与 \(n\),\(m\) 或 \(k\) 相同的异或和。

转移的时候采用刷表法,枚举当前状态,和下一位填什么,去掉不合法的状态,转移即可。

P4124 [CQOI2016]手机号码

考虑算两次后作差。

因为不含前导零,因此先把 \(L\) 和 \(10^{10}\) 取 \(\max\)。

计算的时候不用判断前导零,以为作差直接减掉了。

设 \(dp(i,a,b,o,ok,f4,f8)\) 表示从高到低前 \(i\) 位,其中第 \(i-1\) 位为 \(b\),第 \(i-2\) 位为 \(a\),前 \(i\) 为是否与上界相等,是否有连续的 \(3\) 个相同的数,是否出现 \(4\) 和 \(8\) 的方案数。

P4363 [九省联考 2018] 一双木棋 chess

轮廓线 dp。

任何一种划分矩形左上三角的方式都可以看成一个长度为 \(n+m\) 的轮廓线,这样状态压缩后就非常好转移了。

P5369 [PKUSC2018]最大前缀和

设 \(sum(S)\) 表示集合 \(S\) 的和,\(f(S)\) 表示集合 \(S\) 的任意一个前缀都 \(<0\) 的方案数,\(g(S,0)\) 表示集合 \(S\) 的任意真前缀都 \(\geq 0\) 且 \(sum(S)<0\) 的方案数,\(g(S,1)\) 表示集合 \(S\) 的任意真前缀都 \(\geq0\) 且 \(sum(S)\geq 0\) 的方案数。

\[g(S,0)=g(S\oplus T,1)[sum(S)< 0] \]

\[g(S,1)=g(S\oplus T,1)[sum(S)\geq 0] \]

P4000 斐波那契数列

斐波那契循环节 \(\leq 6p\),根据生日悖论,可以很快找到一个循环节。

P5772 [JSOI2016]位运算

数位 dp + 矩阵快速幂。

钦定 \(N\) 个数按照从大到小排序。

如果只有一个串,那么直接设 \(dp(i,S)\) 表示前 \(i\) 个字符,相等关系为 \(S\) 的方案数。

枚举下一个字符每个数字填什么,除去不合法的状态即可转移。

但字符串很长,不过单个字符串很短。

只有两种字符 \(0\) 或 \(1\),且每次转移只与相等关系 \(S\) 有关,因此可以预处理出 \(2^n\times2^n\) 的转移矩阵,再使用矩阵快速幂即可解决。

P4590 [TJOI2018]游园会

如果没有最长公共子序列的限制,可以直接 dp。

有了最长公共子序列的限制,可以尝试把这一限制加入 dp 状态里。

设 \(dp(i,S,j)\) 表示前 \(i\) 个字符,最后与 “NOI” 的匹配长度为 \(l\),前 \(i\) 个数与模式串最长公共子序列的状态为 \(S\) 的方案数。

重点在于如何压缩 \(S\)。发现差值最大为 \(1\),于是可以状压它们的差值。

P3321 [SDOI2015]序列统计

发现选的数字个数可以合并且只和值域有关。

设 \(f(i,j)\) 表示选 \(i\) 个数字乘积为 \(j\) 的方案数。

\[f(nm,i)=\sum_{j}f(n,j)f(m,\frac{i}{j}) \]

第二维是乘积的形式,不好快速求解。

可以把每个数映射到原根的指数上,那就可以卷积了。

最后再使用倍增 NTT 即可得到答案。

CF372C Watching Fireworks is Fun

设 \(dp(i,j)\) 表示放完前 \(i\) 个烟火在第 \(j\) 个区域所能获得的开心值。

\[f(i,j)=\max_{j-d(t(i)-t(i-1))\leq k\leq j+d(t(i)-t(i-1))}\{f(i-1,k)+b(i)-|a(i)-j|\} \]

P4072 [SDOI2016]征途

\[\begin{aligned} S^2 &=\sum_{i=1}^{m}(v_i-\overline{v})^2\frac{1}{m}\\ &=\sum_{i=1}^{m}(v_i-\frac{sum_n}{m})^2\frac{1}{m}\\ &=\sum_{i=1}^{m}\frac{v_i^2}{m}-2sum_n\sum_{i=1}^{m}\frac{v_i}{m^2}+\left(\frac{sum_n^2}{m^2}\right) \end{aligned} \]

乘上 \(m^2\) 得

\[S^2m^2=-sum_n^2+m\sum_{i=1}^{m}v_i^2 \]

于是只需要 dp 求出 \(\sum_{i=1}^{m}v_i^2\) 的最小值即可。

设 \(f(i,j)\) 表示前 \(i\) 个数分成 \(j\) 段的最小值。

\[\begin{aligned} f(i,j) &=\min_{0\leq k<i}\{f(k,j-1)+(sum_i-sum_k)^2\}\\ &=\min_{0\leq k<i}\{f(k,j-1)-2sum_isum_k+sum_k^2\}+sum_i^2 \end{aligned} \]

从小到大枚举 \(j\),每次往坐标轴中加入 \((sum_k,sum_k^2+f(k,j-1))\),用斜率为 \(2sum_i\) 的直线去切它之前的所有点,使得截距最小。

因此需要维护下凸壳。

又因为横坐标单增,斜率单增,因此可以使用双端队列维护。

P5468 [NOI2019] 回家路线

如果以点为状态进行转移的话还要加一维时间,这是不可接受的。

于是考虑以边为状态进行转移。

设 \(dp(i)\) 表示走到第 \(i\) 条边的起点的最小代价。

\[\begin{aligned} dp(i) &=\min_{y_j=x_i,q_j\leq p_i}\{dp(j)+A(p_i-q_j)^2+B(p_i-q_j)+C\}\\ &=\min_{y_j=x_i,q_j\leq p_i}\{-2Ap_iq_j+dp(j)+Aq_j^2-Bq_j\}+Ap_i^2+Bp_i+C\\ \end{aligned} \]

令 \(y=kx+b\),其中,点的坐标为 \((q_j,dp(j)+Aq_j^2-Bq_j)\),\(k=2Ap_i\)。

要使答案最小,因此需要维护一个下凸壳。

为了满足 dp 的转移顺序,将所有边按照 \(p_i\) 从小到大排序,发现斜率也变得单增了,因此对每个 \(y_j\) 维护一个双端队列。

每次算完一个 dp 值过后把它按照 \(q_j\) 放到一个桶里,当时间到 \(q_j\) 时才把它加入双端队列里。这样,既满足了横坐标的单调性,又满足了 \(q_j\leq p_i\) 的顺序性。

CF321E Ciel and Gondolas

设 \(dp(i,j)\) 表示前 \(i\) 条船送走前 \(j\) 个人的最小代价。

\[dp(i,j)=\min_{0\leq k<j}\{dp(i-1,k)+w(k+1,j)\} \]

\(w(l,r)\) 满足区间包含单调性和四边形不等式,因此可以使用分治优化。

!P5206 [WC2019] 数树

独立地推一遍式子!

P2150 [NOI2015] 寿司晚宴

经典套路,采用根号分治,因为 \(>\sqrt{n}\) 的质数最多只会出现一次,因此只需要状压 \(\leq\sqrt{n}\) 的质数。

设 \(dp(i,S1,S2)\) 表示选了前 \(i\) 个数,质数状态为 \(S1\) 和 \(S2\) 的方案数。

如果 \(i\) 的质因子都 \(\leq \sqrt{n}\)。

\[dp(i-1,S1,S2)\longrightarrow dp(i,S1|s(i),S2)\\ dp(i-1,S1,S2)\longrightarrow dp(i,S1,S2|s(i)) \]

如果 \(i\) 存在 \(>\sqrt{n}\) 的质因子。

可以把所有数按照大质因子排序,连续的一段区间一定是同一个人选。

对是哪一个人选分别 dp 即可。

P6622 [省选联考 2020 A/B 卷] 信号传递

首先,贡献可以拆成每个信号站之间的贡献。

设 \(i\) 号的位置为 \(p_i\)。

如果有 \(x\longrightarrow y\) 的边,那么贡献为

  • 如果 \(p_x\leq p_y\),\(p_y-p_x\)
  • 如果 \(p_x>p_y\),\(k(p_x+p_y)\)。

于是可以预处理出 \(e(x,y)\) 表示 \(x\longrightarrow y\) 的边数。

设 \(f(S)\) 表示前 \(|S|\) 个位置,选择的点的集合为 \(S\) 的最小时间。

\[f(S+i)=\min_{i\notin S}f(S)+(|S|+1)\left(\sum_{j\in S}e(i,j)\times k+e(j,i)+\sum_{j\notin S}-e(i,j)+e(j,i)\times k\right) \]

时间复杂度为 \(O(2^mm^2)\),无法通过本题,考虑预处理。

发现每次转移只和 \(i\) 与 \(S\) 有关,于是预处理 \(g(S,i)(i\notin S)\) 满足

\[f(S+i)=\min_{i\notin S}f(S)+(|S|+1)g(S,i) \]

可以考虑选择一个 \(j=lowbit(S)\)。

\[g(S,i)=g(S-j,i)+e(i,j)\times k+e(j,i)-(-e(i,j)+e(j,i)\times k) \]

P7519 [省选联考 2021 A/B 卷] 滚榜

很明显,如果 \(a\) 的排列确定,可以贪心地选取以尽量使 \(\sum b_i\) 尽量小。

考虑如何计算 \(b_i\) 和的最小值

\[\sum_{i=1}^{n}b_i=\sum_{i=2}^{n}\max(0,a_{p_i}-a_{p_{i-1}}+[p_i>p_{i-1}])\times(n-i+1) \]

于是可以设 \(dp(S,i,j)\) 表示选的数前 \(|S|\) 个数的集合为 \(S\),其中第 \(|S|\) 个为 \(i\),\(b\) 的总和为 \(j\) 的方案数。

枚举下一个数选什么即可转移。

标签:10,frac,省选,S2,sum,times,leq,动态,dp
From: https://www.cnblogs.com/yanchengzhi/p/17002012.html

相关文章

  • 省选05. 线性代数
    P6772[NOI2020]美食家先假设没有美食节,容易得到一个矩阵优化的dp。加上美食节过后分成\(k\)段考虑,每段分别矩阵快速幂,时间复杂度为\(O((5n)^3k\logT)\)。这并不......
  • 省选06. 分治
    CF1442DSum设\(dp(i,j)\)表示前\(i\)个数组选\(j\)个元素的最大值。\[dp(i,j)=\max_{k=0}^jdp(i-1,k)+sum(i,k)\]因为数组内的元素单调不降,因此有一个结论,只有一......
  • 省选03. 树上问题
    P2664树上游戏首先,将贡献拆成每种颜色对每个点的贡献。考虑已经选择了一种颜色,将这些颜色的点和所对应边全部删去,就得到了很多连通块。假设其中一个连通块的大小为\(s......
  • 省选04. 数论
    P4571[JSOI2009]瓶子和燃料先对两个容量分别为\(a\),\(b\)的瓶子考虑。可以发现,无论是倒入还是倒出,体积都是\(a\)或\(b\)的整数倍。因此可以考虑求\(ax+by\)的......
  • POJ 1080 Human Gene Functions
    POJ1080HumanGeneFunctions题意:给出两组\(DNA\)序列求它们的最大相似度每个字母与其他字母或自身和空格对应都有一个打分,求在这两个字符串中插入空格,让这两个字......
  • You are using pip version 10.0.1, however version 22.3.1 is available.
    解决方法升级pip(选择一个即可):解决方法1:python-mpipinstall--upgradepip解决方法2:pipinstall--upgradepip解决方法3: python3-mpipinstall--upgradepip解决方......
  • Solution -「COCI 2009-2010」「洛谷 P8076」RESTORAN
    \(\mathscr{Description}\)  Link.  给定一个含\(n\)个点\(m\)条边的简单图,求一种边二染色方案,使得所有\(\deg\ge2\)的结点都邻接于两种颜色的边.  \(n......
  • # Win10为知笔记Docker镜像部署 -v /wiz/storage问题解决
    Win10为知笔记Docker镜像部署-v/wiz/storage问题解决用了很长一段时间的为知笔记,客户端体验还行,服务端笔记同步体验不佳。准备用Docker自己搭一个服务端。环境:操作......
  • 代码随想录算法训练营Day23|669. 修剪二叉搜索树、108. 将有序数组转换为二叉搜索树、
    代码随想录算法训练营Day23|669.修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树669.修剪二叉搜索树与删除节点类似,但不需要讨论左/......
  • win10系统安装mysql
    1.下载mysql在这个网址:downloads.mysql.com/archives/community/(前面需要加HTTPS),找到Windows(x86,64-bit),ZIPArchive这一行,然后下载解压到D:\MYSQL;2.配置mysq......