zoukankan      html  css  js  c++  java
  • DP 题集 1

    关于 DP 的一些题目


    参考资料

    DP

    • Rain and Umbrellas
    • Mr. Kitayuta, the Treasure Hunter
    • Power of String 首先我们最多只会在一种字母中选择部分个,否则要么都选,要么都不选。以及我们一定会把其他字母转化成一种字母。枚举要转化成的字母以及可能选部分的字母,然后就是01背包DP。复杂度(O(26^3k))
    • Fibonacci String Subsequences 对于这类字符串计数DP,一般就要考虑怎么去拼接字符串,DP的状态和字符串的子串有关。(dp[i][l][r]) 表示到第 (i) 个 Fibonacci 串时,包含了目标串的子串 ([l,r]) 的子序列的个数。
    • Gerald and Giant Chess 考虑到 (k=2000),所以 DP 的状态必然是和障碍物有关的,(dp[i])表示到达第 (i) 个障碍物的路径上没有经过其它障碍物的方案数。
    • Buggy Robot (dp[x][y][i]) 表示到 ((x,y)) 这个点,在字符串中走到了第 (i) 个位置的最小花费。在 (BFS) 中进行状态转移,转移复杂度 (O(1))
    • Group Projects 学到一个DP姿势。分组计数,(dp[i][j][k])表示到第 (i) 个人时,有 (j) 个组还是开放的(即可以被选择)不公平的值的和为 (k) 时的方案数。关键就是开放的组这一维,枚举 (a[i]) ,我们可以去定义他的行为,是独自成组?还是加入别的组?还是新建一个开放的组?还是加入一个组并关闭这个组?显然不同的行为对应不同的状态转移。还有由于我们知道了开放的组的数量(j) ,考虑 ((a[i]-a[i-1])*j) ((i eq0))((a) 数组先排序) ,就是那些仍然开放的组需要加的不公平的值的和。
    • Increase Sequence (dp[i][j]) 表示到第 (i) 个数时,有 (j) 个还未关闭的区间的方案数(这里未关闭的意思是还没有确定区间的右端点)。显然考虑每一个还未关闭的区间,都会给当前点加上 (1) ,据此可以推出状态转移方程了。时间复杂度 (O(n))
    • Sereja and Intervals (dp[i][j][k]) 表示到第 (i) 个数时,还有 (j) 个未关闭的区间,已经关闭了 (k) 个区间的方案数。对于每个数,考虑是关闭前面的区间呢(显然只能关闭第一个未关闭的区间)?还是新开一个区间?还是不管这个数。
    • Ducks in a Row 可以发现翻转的区间一定不相交,所以可以考虑 (DP)(dp[o][i][j][k]) 表示到 (o) 这个位置,前面是否翻转 ( (i) ),连续的 (D) 的数量为 (j) ,符合条件的(D)连续段的数量为 (k) 时所需的最小翻转次数。因为 (j*kleq)字符串的长度。所以时间复杂度 (O(n^2))
    • Spinning Up Palindromes (dp[l][r][i][j]) 表示 (S[1...l]) 等于 (S[r...n]) 时从 (dp[l-1][r+1][i'][j']) 转移过来,(l+1) 是否需要向 (l) 进位 ((i)) ,(r)(r+1) 得到的进位为 (j) 时的最小花费。转移怎么好写怎么来,大力枚举使得两边相同时要加的数即可。因为 (l)(r) 具有相关性,所以数组可以写成 (dp[l][i][j])
    • Eighty seven 考虑前缀后缀,开两个 (bitset) 类型的 (DP) 数组,以前缀为例,(dp[i][j][k]) 表示到第 (i) 个数,一定不选 (j) 这个位置上的数,选了 (k) 个数时所有可能的和(二进制位为(1)表示有这样的和)。对于后缀的数组,如果二进制位 (i) 上的数字为(1),可修改为 (bit[87-i]=1),那么对于询问,枚举 (k) ,将前缀后缀按位与,检查是否有二进制位为(1)
    • Candy Chain (f[l][r]) 表示删掉 (S[l...r]) 这个子串能得到的最多的钱。然后 (dp[i] = max(dp[i-1], dp[j] + f[j+1][i]) (j < i))(dp[len(S)]) 即为答案。预处理 (f[l][r]),枚举 (S) 的子串 (s) 以及所有的待匹配串 (t) ,令 (g[i][j]) 表示 (s[1...i]) 删除一些字符(或不删)等于 (t[1..j]) 时得到的最多的钱。(f[l][r]=g[r][len(t)])。也可以用字典树优化,将待匹配串建树,同样枚举子串,然后有 (g[i][j]) 表示以 (i) 结尾的字符串在字典树上的状态为 (j) 时可以得到的最多的钱,(f[l][r]=g[r][0])。有三种转移,要么在字典树上向下走,要么删掉一个区间(可以借助已经计算出的 (f[l][r]) 转移),要么删掉 (j) 这个状态代表的字符串。
    • Mahmoud and Ehab and yet another xor task 考虑异或集合的性质(对于任意两个数,他们的异或值都在集合中),对于一个数 (a[i]) 如果 (a[i]) 不在集合中,那么对于集合中的任意数 (x)(a[i] xor x) 都不会在集和中。维护一个集合,枚举 (a[i]) ,如果发现 (a[i]) 已经在集合中,所有数的构成方案数都翻倍,否则把这个数和集合中所有的数分别异或并加入集合。可以发现这样需要离线处理,另一种做法,通过预处理线性基在线回答询问。
    • Compute Power 求最小比率,二分答案 (x) ,若存在更优的答案,则有 (sumfrac{a_i}{b_i}<x),判断是否存在 (sum{a_i}-x*{b_i}<0)。先把给的东西按 (a) 从大到小排序,考虑 (dp[i][j][k]) 表示到第 (i) 个时,等于 (a[i]) 的数量为 (j) ,大于的数量为 (k),根据是否选择进行转移。

    树形DP

    • Appleman and Tree
    • Counting on Tree
    • Tree Pruning 虽然 (O(nk^2)) 可以过,但是有(O(nk))的做法,考虑先预处理出 DFS 序再 DP。
    • Road Improvement 0 没有逆元,所以不能直接除。对于一个结点,他的兄弟结点的方案数的乘积可以通过预处理前缀后缀得到。

    状态压缩DP

    • Little Pony and Harmony Chest 状态中0/1表示是否存在某个素数,最多只有17个素因子。
    • Remembering Strings 一维数组,时间复杂度(O(m2^n))。状态中0/1表示某个单词是否变成好记的单词了。
    • Another Sith Tournament (dp[i][S]) 表示擂主为 (i) 时,活着的人状态为 (S) 时主角能获胜的概率,(dp[0][1]=1)。时间复杂度(O(n^22^n))
    • Exciting Finish! 注意到题目求的是有多少种不同的排名,即分数不同排名相同属于同一种情况。又分配的分数呈不下降,所以当我们分配一个分数给某人时,可以当成也给其他未分配的人分配了相同的分数,那么要使一个人的分数变成最大,只需要比较初始分数即可。(dp[s][i][j]) 表示人的状态为 (s) ,上一次分配的人是 (i),还剩下分数 (j) 未分配的方案数。记忆化搜索实现。
  • 相关阅读:
    Tinyhttpd
    Fiddler教程(Web调试工具)
    windows消息值全部定义,从消息值得到消息名称(系统消息定义从0到1023,从1024开始就是WM_USER,但是中间有325个WM_undefined消息,估计是备用,另外各控件都有一些reserved消息,也是为了备用)LostSpeed
    生意经:凡是现今比较会赚钱或是规模比较大的软件公司大都属于开发"消费型软件"的公司(而且登广告,应该定低价进行销售)
    Folly: Facebook Open-source Library Readme.md 和 Overview.md(感觉包含的东西并不多,还是Boost更有用)
    DefaultFilesMiddleware中间件如何显示默认页面
    Linux模块编程框架
    编程一小时
    DirectoryBrowserMiddleware中间件如何呈现目录结构
    gRpc NET Core
  • 原文地址:https://www.cnblogs.com/ftae/p/9753240.html
Copyright © 2011-2022 走看看