
DP
文章平均质量分 58
sancpp
这个作者很懒,什么都没留下…
展开
-
牛客练习赛86 C. 取钱(DP)
传送门分析见代码注释#include <bits/stdc++.h>using namespace std;//-----pre_def----const double PI = acos(-1.0);const int INF = 0x3f3f3f3f;typedef long long LL;typedef unsigned long long ULL;typedef pair<int, int> PII;typedef pair<double, do原创 2021-11-01 14:22:54 · 158 阅读 · 0 评论 -
牛客练习赛59.E 石子搬运(数据结构优化dp)
传送门分析dp状态表示:f[i][j]表示前i个物品搬运了j次的最小代价。因为第x个物品搬n次是可以o(1)o(1)o(1)算出来的。LL calc(int x, int n){ if (x <= n) return 1ll * x; int cur = x / n, tmp = x -= cur * n; return 1ll * cur * cur * (n - tmp) + 1ll * tmp * (cur + 1) * (cur + 1);}原创 2021-10-17 14:50:20 · 146 阅读 · 0 评论 -
NC21336 和与或 (数位dp变形)
传送门分析给你一个数组R,包含N个元素,求有多少满足条件的序列A使得0 ≤ A[i] ≤ R[i]A[0]+A[1]+…+A[N-1]=A[0] or A[1]… or A[N-1]第一行输入一个整数N (2 ≤ N ≤ 10)第二行输入N个整数 R[i] (1 ≤ R[i] ≤ 1e18)很明显 等式左边不能产生二进制进位。那么A[]数组的二进制表示中,不可能有两个元素的相同的位都是1。举例:10012+102+00002=101121001_2+10_2+0000_2=1011_210原创 2021-10-06 16:06:26 · 184 阅读 · 0 评论 -
CF855E Salazar Slytherin‘s Locket(数位dp 状压)
传送门分析数位dp 问题是如何记录状态。题目要统计出现偶数次的个数->二进制利用二进制记录第i个数出现次数的奇偶性。代码#include <bits/stdc++.h>using namespace std;//-----pre_def----const double PI = acos(-1.0);const int INF = 0x3f3f3f3f;typedef long long LL;typedef unsigned long long ULL;typ原创 2021-09-23 16:26:27 · 196 阅读 · 0 评论 -
HDU4745 Two Rabbits(区间dp)
wsfw 卡在最后的答案统计了,看了别人的博客,觉得很有道理。先破环成链,答案有两种情况:1.在一段区间(最长为n)中的回文子序列:12321。两人站在l,r的位置开始行动2.对于一个长度为n-1的序列来说,str[l-1]==str[r+1],所以有一种情况是两人站在l-1,r+1的位置开始行动。(说白了,l-1,r+1是同一个点,这种情况就是起点相同的情况。)#include <bits/stdc++.h>using namespace std;//-----pre_def--原创 2021-08-23 20:43:01 · 140 阅读 · 0 评论 -
HDU4123 Bob’s Race(树形dp,RMQ,树的直径)
传送门题意一棵n点的树,每一个点都从当前位置走到距离最远的位置的距离dis[i],1~n的连续区间中最大并且走的最远距离差值不超过Q的区间右多大。分析感觉有点不好下手最后的询问是区间最大值减最小值,可以用RMQ实现。那么就需要处理出每个点从当前位置走到距离最远的位置的距离dis数组了。直觉上能dfs预处理出来,类似求树的直径,要注意的点是如何处理从父亲结点下来的长度。这里还是有很多细节的,需要想清楚,先dfs1出儿子结点(只向下)最远的距离,在dfs2和从父亲结点来的比较。但是如果父亲结原创 2021-08-23 18:23:24 · 123 阅读 · 0 评论 -
2017ACM/ICPC亚洲区沈阳站 Tree(思维+dfs)
传送门题意一个n点的树,将树上点染成k(k<=500)种颜色。将染成第i中颜色的点连起来(类似生成树)的边集为EiE_iEi求k个边集的交集最大边的个数分析什么样的边不符合条件?如果这条边所连接的两颗子树的大小有一个小于k,说明一端不能被染成k种颜色。(抽屉原理)反之:如果这条边所连接的两颗子树的大小都大于等于k,则一定可以并且,边与边之间是没有相互制约的。(反证法)所以,dfs一遍,如果这条边所连接的两棵子树大小都大于等于k,ans++。...原创 2021-08-17 15:03:53 · 116 阅读 · 0 评论 -
P1412 经营与开发(DP 倒序)
传送门题意你驾驶着一台带有钻头(初始能力值w)的飞船,按既定路线依次飞过n个星球。星球笼统的分为2类:资源型和维修型。(p为钻头当前能力值)1.资源型:含矿物质量a[i],若选择开采,则得到a[i] * p的金钱,之后钻头损耗k%,即p=p * (1-0.01k)2.维修型:维护费用b[i],若选择维修,则支付b[i] * p的金钱,之后钻头修复c%,即p=p * (1+0.01c)注:维修后钻头的能力值可以超过初始值(你可以认为是翻修+升级)金钱可以透支。请作为舰长的你仔细抉择以最大化收入原创 2021-03-11 19:27:17 · 210 阅读 · 0 评论 -
牛客13230 合并回文子串(区间dp)
传送门题意输入两个字符串A和B,合并成一个串C,属于A和B的字符在C中顺序保持不变。如"abc"和"xyz"可以被组合成"axbycz"或"abxcyz"等。我们定义字符串的价值为其最长回文子串的长度(回文串表示从正反两边看完全一致的字符串,如"aba"和"xyyx")。需要求出所有可能的C中价值最大的字符串,输出这个最大价值即可。input:第一行一个整数T(T ≤ 50)。接下来2T行,每两行两个字符串分别代表A,B(|A|,|B| ≤ 50),A,B的字符集为全体小写字母。分析由数据原创 2021-03-05 20:53:14 · 157 阅读 · 0 评论 -
洛谷P3092 [USACO13NOV]No Change G (状压dp+二分)
传送门题意约翰到商场购物,他的钱包里有K(1 <= K <= 16)个硬币,面值的范围是1…100,000,000。约翰想按顺序买 N个物品(1 <= N <= 100,000),第i个物品需要花费c(i)块钱,(1 <= c(i) <= 10,000)。在依次进行的购买N个物品的过程中,约翰可以随时停下来付款,每次付款只用一个硬币,支付购买的内容是从上一次支付后开始到现在的这些所有物品(前提是该硬币足以支付这些物品的费用)。不幸的是,商场的收银机坏了,如果约翰支原创 2021-02-28 17:11:49 · 168 阅读 · 0 评论 -
2021牛客寒假算法基础集训营6 G.机器人 (状压dp+__int128)
传送门题意有 n 个机器人,每个机器人会读入一个 x ,并返回 ax+b 。现在银临姐姐手里有一个数 x ,她想将机器人按某种顺序排列,使得最终返回得到的 x 尽可能大。对于所有的数据,1≤n,x,ai,bi≤20\le n,x,a_i,b_i\le20≤n,x,ai,bi≤20 。分析区间dp裸题,但是动手算算上界会超longlong。调了好久的高精都有问题(板子是很久之前写的,现在看起来当时写的并不好),最后__int128水过去了。关于__int128仔细整理一下__int128原创 2021-02-25 00:34:30 · 1538 阅读 · 4 评论 -
P1005 [NOIP2007 提高组] 矩阵取数游戏(区间dp+__int128)
传送门思路不解释了:大佬的题解看到这题__int128也能过,想拿__int128试试。遇到的小坑:f[i][j] = max(f[i - 1][j] + (1 << (m - j + i - 1)) * d[i - 1], f[i][j]);f[i][j] = max(f[i][j + 1] + (1 << (m - j + i - 1)) * d[j + 1], f[i][j]);上面的写法是错的(不知道怎么解释 )f[i][j] = max(f[i - 1][j原创 2021-02-25 00:33:20 · 398 阅读 · 0 评论 -
E. Pencils and Boxes (树状数组优化dp)
传送门1.题意给出n个数,要求给这些数分组,每组不少于k个。每组的数之间的差不能大于d。是否能够分组?2.dp分析先排序。f[i]f[i]f[i]表示[1~i]能够分组成功。答案就是f[n]f[n]f[n]如何更新?举例:n=12 k=3 d=21 2 3 9 10 11 12 13 14 15 15 15当更新到b[11]b[11]b[11](15)时:1.[8 ~ 11]能分成一组,如果[1 ~ 7]能够分组成功(f[7]f[7]f[7]=1),则[1 ~ 11]能够分组原创 2021-02-21 21:57:04 · 207 阅读 · 1 评论