随笔分类 -  ACM / dp

摘要:传送门 题意: 每次询问一个区间,求这个区间最长单调递增子序列的长度 题解: 赛时想到了尺取预处理,从当前的点开始第一个高度大于它的点的位置 然后就没有然后了 赛后看题解,用的方法是倍增,具体方法是,维护一个数组st[j][i] 代表从j点开始,跳$2^i$次能到哪个点 这样的话每次询问复杂度就到了 阅读全文
posted @ 2021-06-25 23:06 Isakovsky 阅读(89) 评论(0) 推荐(0)
摘要:传送门 题意: 给出一个全由小写字母组成的字符串,让你找出三个区间,这三个区间不能重合,并且每个区间内1,每个字母出现的顺序不能超过m次,找出使得这三个区间长度之和最大的情况 题解: 1,如何找出最长的一个区间使得每个字母出现的次数不超过m次 用一个数组记录26个字母分别出现多少次,再用一个指针记录 阅读全文
posted @ 2021-06-25 22:51 Isakovsky 阅读(81) 评论(0) 推荐(0)
摘要:传送门 中文题面就直接复制了 给定一个长度为 n 的序列a和一个长度为 n 的序列b,对于序列a中的每一个数字$a_i$,牛牛都可以进行以下操作:(1) 将数字 $a_i从 a_i$ 变成 $a_i + b_i$ ;(2) 将数字 $a_i从 a_i$ 变成 $a_i - b_i$ 。牛牛很懒,所以 阅读全文
posted @ 2021-01-01 09:09 Isakovsky 阅读(103) 评论(0) 推荐(0)
摘要:题意: 给定一个二进制表示的n,让你找满足如下要求的数对(i,j)的个数 $0 \leqslant j \leqslant i \leqslant n$ $ i & n = i $ $ i & j = 0 $ 其中&代表按位与 题解: 打表发现对于单个i满足上述规律的j的数量为$2^{(num \ 阅读全文
posted @ 2019-12-13 13:58 Isakovsky 阅读(334) 评论(0) 推荐(0)
摘要:题意: 连续3个特定的按键(在这3个中不要求顺序)能使出某个技能,使出不同技能所需要的按键可以重叠,给你一个技能序列,问你最少花费多少次按键能按顺序使出这些招数。 题解: dp,dp[i][j]代表使出第i个技能后,最后3个按键组合是j的最少需要按键数,暴力枚举即可。 思路比较绕,实际码的时候很自闭 阅读全文
posted @ 2019-10-09 10:23 Isakovsky 阅读(320) 评论(0) 推荐(0)
摘要:题意: 一个游戏,有许多关,到下一关要花费金钱,做出尝试,有概率成功,若成功则到达下一关,若失败则停在此关或退回到前面某关,询问第l关到第r关的期望费用 题解: 显然,第r关到第l关的费用是dp[r]-dp[l] 那么如何算出dp数组呢?首先dp[1]=0,利用期望方程正推 假设i点,成功率为p,失 阅读全文
posted @ 2019-08-13 23:38 Isakovsky 阅读(167) 评论(0) 推荐(0)
摘要:题意: 给你n个数,求如下限制条件下的排列数:1,第一位必须是x,2,最后一位必须是y,3,相邻两位之差小于等于2 题解: 如果x<y,那么考虑把整个数列翻转过来,减少讨论分支。 设dp[n]为限制1和n在两边,相邻的数之差小于等于2的排列方案。 dp[0]=1 dp[1]=1 dp[2]=2 dp 阅读全文
posted @ 2019-08-05 23:13 Isakovsky 阅读(264) 评论(0) 推荐(0)
摘要:题意: 有n个技能,一开始都是0级,第i个技能从j-1级升到j级,花费$c_{i,j}$,但是花费不一定是正的 所有的技能升到j级时,奖励$d_j$但是奖励也不一定是正的 题解: 用sum[i][j]储存-c[i][j]的前缀和,即技能i升到j级后总共的收益。 再用w[j]储存f[j]的前缀和,代表 阅读全文
posted @ 2019-08-03 21:46 Isakovsky 阅读(184) 评论(0) 推荐(0)
摘要:题意: 给定两个由数字组成的序列s,t,找出s所有数值大于t的子序列。注意不是字典序大。 题解: 首先特判s比t短或一样长的情况。 当s比t长时,直接用组合数计算s不以0开头的,长度大于t的所有子序列数量。 然后再去看s的和t一样长的子序列。 就是在找s和t的公共子序列,并且一旦某一位s比t大了,就 阅读全文
posted @ 2019-08-02 18:43 Isakovsky 阅读(197) 评论(0) 推荐(0)
摘要:题意: 有个打字机,在当前字符串后新加一个字花费p,把当前字符串的一个连续子串拷贝到当前字符串的末尾花费q,给定一个字符串,求用打字机打出这个字符串的最小花费。 题解: 容易想到用dp 记dp[i]为打出前i个字符的最小花费,对于每个i,令 A=dp[i-1]+p B=dp[j]+q 其中j为最小的 阅读全文
posted @ 2019-07-25 19:33 Isakovsky 阅读(362) 评论(0) 推荐(0)