动态规划
各式各样的dp例题,背包等
~KIKI~
这个作者很懒,什么都没留下…
展开
-
sosdp(高维前缀和)
思想sosdp跟状压差不多,以5(101)为例,状压记录的是(100, 1)这两个状态,而sosdp记录的是(101, 100, 1, 0)这四个状态,也可以说是他的子集。即sosdp[mask]存的是 所有的a[i],其中i&mask == i或者i|mask == mask。实现方法//dp[j]记录子集的和for(int i = 0; i < n; i ++){ for(int j = 0; j < (1 << n); j ++){原创 2021-03-19 16:56:20 · 854 阅读 · 2 评论 -
Digits Paradise in Hexadecimal (数位dp)
题目链接:abc194_5题目大意给你一个长度2e5的16进制表示的数字串S,问你从1到S的这些数中(16进制表示),数字表示正好出现k种数的个数。比如12321,她就有3种数。思路数位dp,不过要考虑前导零。他要k种数,可以用state记录状态,比如5(101)就表示他的状态是取了1,3,有2种数。然后呢dp数组中除了要有下标pos,上界限制limit,前导零led外,还要引入一个cnt,表示该状态的种数,因为返回dp数组的前提是dp数组已经修改过,并且没有上界限制了,也就是说,后面可以随原创 2021-03-14 19:29:23 · 206 阅读 · 0 评论 -
牛数(ac自动机+数位dp)
题目链接:牛客IOI周赛23-提高组B题目大意给你n个数字串,定义牛数x,n个数字串都不是x的子串。然后给你一个长度为2000的数字s,问你[1, s]之间牛数有多少个。思路多个模式串匹配主串,就自然而然地会想到ac自动机了,然后问你[1,s]之间满足条件的数的个数,那么就是数位dp了,不过这里的数位dp要在Trie树上跑,还要注意判断前导零。ac代码#include<bits/stdc++.h>using namespace std;#define io cin.原创 2021-03-13 18:56:33 · 417 阅读 · 0 评论 -
多彩的树(状压dp + 数学)
题目链接:https://ac.nowcoder.com/acm/problem/17061题目大意n个点,n-1条边的树,每个节点都有颜色,一共有k种颜色,表示颜色有i种的路径数,求解1<=k<=10, 1<=n<=5e4思路颜色数量少,可以上状压,表示选中的颜色,比如5(101)表示当前选的颜色1,3。然后按照这些颜色跑树上的连通块,当前连通块大小是cnt,那么可以形成的路径数是cnt(单点)+(两个点)但是呢比如5(101)包含了4(100),1(001原创 2021-03-04 22:37:48 · 257 阅读 · 1 评论 -
牛客训练营G 机器人(状压dp||记忆化搜索)
题目链接:点这里~题目大意n个机器人,每个机器人会读入一个x,并返回ax+b。现在有一个x,想让你合理安排机器人顺序,使得最终返回得到的x尽可能大,输出最大值。(1<=n,x,ai,bi<=20)思路给的范围很小才20,那么就可以考虑到状压dp。dp[i][t]表示第i次循环在状态t的情况下出的最大值。t在二进制状态下1的位置表示该位置的机器人已经取过,比如5(101)表示1和3位置的机器人已经使用过。所以第i次循环中就枚举状态t中0的位置j,然后使用该机器人j,那么使用过机原创 2021-02-26 22:57:54 · 102 阅读 · 0 评论 -
九峰与子序列(字符串哈希+dp)
题目链接:点这里~题目大意n个字符串,一个主串s,问多少个子序列串能够拼接成主串s?n<=40, 1<=|s|<=5e6思路这个dp有01背包的思想,dp[i][j]表示前i个字符串能够拼接成s的前j个字符的个数,与01背包不同的就是用到了字符串哈希判断是否相等。tmp是字符串的哈希值,len是字符串的长度,如果tmp等于主串s的子串get(j - len + 1, j)的哈希值,说明可以放最后组成s的前j个字符,那么dp[i][j]+=dp[i-1][j-le原创 2021-02-20 23:04:01 · 194 阅读 · 1 评论 -
2021牛客寒假算法基础集训营1 A-串(dp推状态)
题目链接:点这里~题目大意长度不超过n,且包含子序列“us”的、只由小写字母构成的字符串有多少个? 答案对1e9+7取模。 范围:2≤n≤1e6思路用dp转移状态 定义:dp[i][0]表示长度为i的串没有u,dp[i][1]表示长度为i的串有u但没有s,dp[i][2]表示长度为i的串有us子序列。 初始化:dp[1][0] = 25, dp[1][1] = 1, dp[1][2] = 0. 状态转移:dp[i][0] = dp[i - 1][0] * 25(之前没有u,当前位也不选原创 2021-02-01 21:48:30 · 403 阅读 · 0 评论 -
AtCoder Beginner Contest 190 E - Magical Ornament
题目链接:点这里~题目大意n颗宝石,m种关系ai,bi,说明宝石ai和bi可以放相邻的位置,然后给了k个宝石编号ci 问怎么合理串宝石,使得包含所有k个宝石,并且一共使用的宝石数量最少 范围1≤N≤1e5, 0≤M≤1e5, 1≤ai<bi≤N,1≤K≤17,1≤Ci≤N m对关系没有重复思路bfs+状压dp 可以将这m个关系看成m条边,边的权值是1,然后就是构建一条最短路,使得跑完所有k个点ci 跑k个bfs,记录dis[i][x],表明点c[i]到点x的最短路径 接下..原创 2021-01-31 22:42:11 · 100 阅读 · 0 评论 -
zcmu1381: 简单题(多重背包)
题目链接:https://acm.zcmu.edu.cn/JudgeOnline/problem.php?id=1381题目大意n种砝码,每种砝码重ai,有bi个,问你最小不能称的重量是多大?最大不超过8500.范围:(a<100,b<100)思路背包题,有数量限制,那么就是多重背包,就是看背包能不能装满,以下两种dp方式求解01背包。1.dp[i]表示容量为i的包能不能装满,能的话dp[i]=1。2.dp[i]表示容量为i的包能装的最大价值,其中每个砝码的价值等于重原创 2021-01-29 22:20:10 · 295 阅读 · 0 评论 -
zcmu5142: 巴比伦塔
题目链接:https://acm.zcmu.edu.cn/JudgeOnline/problem.php?id=5142题目大意搭积木。n种积木,每种长宽高给定,数量不限。一个积木a能搭在另一个积木b上的条件是b底的长宽都严格大于a底的长宽。然后问你搭积木的高度最大值。思路每种积木经过旋转一共有三种情况,就是三个不同底,假设ai是积木底的宽,bi是积木底的长(ai<=bi),所以将这n种积木分成3*n个积木底,高是ci,那struct存。然后按照先ai升序,后bi升序对这3*n个数原创 2021-01-29 21:29:03 · 188 阅读 · 0 评论 -
zcmu1368: Dynamic Programming(多重背包)
题目链接:https://acm.zcmu.edu.cn/JudgeOnline/problem.php?id=1368题目大意n种物品,背包容量w。每种物品体积wi,价值vi,有ci个。求背包能取的最大价值。范围:(1 <= n<= 100, 1 <= w<= 50000, 1 <= wi<= 10000, 1 <= vi<= 10000, 1 <= ci<= 200)思路多重背包裸题。当总体积大于等于背包容量的时候...原创 2021-01-29 00:35:52 · 140 阅读 · 0 评论 -
zcmu1166: 忠哥的dp(II)
题目链接:https://acm.zcmu.edu.cn/JudgeOnline/problem.php?id=1166题目大意n个硬币,面值是ai,每种无限多。然后给你一个s,可以选用多少数量的硬币,使得总面值恰好等于s。输出硬币数量的最小值和最大值。思路选物品,数量无限多,那么就是完全背包了。dp1[i]都表示面值是i的硬币数量。要使得总面值等于j,有两个选择:选当前的a[i],或者不选a[i]。如果选了a[i],那么就只剩s-a[i],如果dp1[j-a[i]]==inf,或者原创 2021-01-24 17:09:45 · 215 阅读 · 0 评论 -
zcmu1539: 完美序列
题目链接:https://acm.zcmu.edu.cn/JudgeOnline/problem.php?id=1539题目大意定义完美序列为长度为l,最大值不超过n且升序,然后前一位是后一位的因子。给你n和l,问你有多少个完美序列对1e9+7取模思路dp预处理,dp[i][j]表示长度为i,最后一位是j这样的完美序列的个数,k从j开始然后是j*2,j*3,一直到上限n,这里的k都可以作为末尾是j的完美序列的下一位,所以dp[i][k]就是dp[i-1][j](1<=j<=n原创 2021-01-16 19:20:58 · 481 阅读 · 0 评论 -
cf1353E. K-periodic Garland(字符串的dp)
题目链接:https://codeforces.com/problemset/problem/1353/E题意:给你一个长度为n的01串s, 和一个正整数k。 操作:每次操作将串中的0变成1,或者将串中的1变成0 问:至少需要操作几次,才能使得传中所有相邻1下标之差等于k?(如果只有一个1或者没有1 也满足)思路:原问题:至少操作几次,才能使得1 ~ n(整个串)所有相邻’1‘下标之差等于k。 子问题:至少操作几次,才能使得1 ~ i 的子串所有相邻’1‘下标之差等于k。 d.原创 2020-09-10 20:30:43 · 164 阅读 · 0 评论 -
牛妹爱数列_牛客练习赛67
题目链接:https://ac.nowcoder.com/acm/contest/6885/D题意给你一个长度为n的仅包含01的序列a,并执行以下操作 单点修改:0->1 ,1->0 前缀修改:将1~x上的所有点修改 问最少操作,使得序列全变0思路简单dp。 dp[i][0]表示把1到i的所有点变成0需要的最少操作 dp[i][1]表示把1到i的所有点变成1需要的最少操作 转移方程: 当a[i]==0时,dp[i][0]要么前面全是0(dp[i-1][0]),原创 2020-08-16 13:10:09 · 296 阅读 · 0 评论 -
2020上海高校程序设计竞赛暨第18届上海大学程序设计联赛夏季赛(同步赛)解题报告ABCEG
题目链接:https://ac.nowcoder.com/acm/contest/6871A-同源题意思路AC代码B-分子题意求有机分子式量。一个C 原子的式量为13 ,一个H 原子的式量为1 ,一个O 原子的式量为17 。一个有机分子的式量恰为各个原子的式量的总和。 原子后面带有数字表示原子的个数,括号后面带有数字表示整体的个数 括号不嵌套括号思路字符串模拟。 带有括号的分开模拟,一块一块计算,这里写了个cal函数,不带括号的处理方式一样的 注意...原创 2020-08-06 10:50:54 · 322 阅读 · 0 评论 -
2020杭电多校第四场 解题报告1002 1004 1005 1011
1002Blow up the Enemy题意:张三父子俩对狙。有n把狙击枪,每个人选中了枪就不能换,每把枪有两个属性,一个是攻击值,一个是延迟时间,开枪之后要等延迟时间之后才能打第二枪,这里规定第一枪没有延迟时间。每个人血量初始值为100,被击中一枪,血量就被扣对方枪的攻击值。现在开始选枪,如果张三当前选的枪最终能够击败对方,那么赢得概率为1,如果打平手,那么赢得概率为0.5。问张三能赢得最大概率。解题思路:贪心+概率。求出所有枪能够击败对方需要花的时间,然后按照时间从小到大排序,张.原创 2020-08-02 11:00:52 · 378 阅读 · 0 评论 -
2020牛客暑期多校训练营(第六场)解题报告BCEGHK
题目链接:https://ac.nowcoder.com/acm/contest/5671#questionB-Binary Vector看样例可得#include<bits/stdc++.h>using namespace std;typedef long long LL;typedef unsigned long long ULL;const int INF = 0x3f3f3f3f;const double pi=acos(-1),eps=1e-8;con..原创 2020-07-27 21:09:03 · 184 阅读 · 0 评论 -
2020杭电多校第二场(解题报告)
Total Eclipse题意:有个n个点m条边的图,每个点都有权值,每次可以选择一个点权全是正数的连通块,让他们的权值整体-1,问把所有点权值变成0需要多少次操作。(1≤n,m≤1e5)样例输入:13 23 2 31 22 3输出:4hint:并查集。正难则反。反着操作,先按照权值从大到小排序,从最大点开始倒着添加边,一开始加入新的点,作为单独的个体i,需要操作ai次,然后把他相邻的边依次加上。当他的存在使得两个连通块融合时,那么两个连通块共享这个i,并且两.原创 2020-07-24 20:09:54 · 283 阅读 · 0 评论 -
2020牛客暑期多校训练营(第四场)解题报告 BFH
题目链接:https://ac.nowcoder.com/acm/contest/5669B-Basic Gcd Problem题意:给你一个函数的定义,求解%输入:23 310 5输出:325hint:规律通过举例几个数就可以发现其实他就是在求,其中cnt表示n的质因子幂次之和,比如,那么cnt=1+2=3,那么。由于输入量有点大,需要提前预处理一下这个cnt,这边采用的是dp处理。还有一点就是需要特判一下n=1的情况cnt=0,所以输出1。...原创 2020-07-21 10:16:09 · 209 阅读 · 0 评论 -
牛客编程巅峰赛S1第4场 - 黄金&钻石(解题报告)
题目链接:https://ac.nowcoder.com/acm/contest/6384A-牛牛分蛋糕题意 :分两种蛋糕,有n个盘子,两种蛋糕数量分别是a,b个。一个盘子只能放一种蛋糕 盘子要用完 求盘子上最少蛋糕的最大值。 n,a,b(1 ≤ a, b ≤ , 2 ≤ n ≤ a + b)输入:4 7 10输出:3方法一:枚举第一种蛋糕放了多少盘子,并更新最大值class Solution {public: /** * 处...原创 2020-07-20 11:53:10 · 141 阅读 · 0 评论