随笔分类 -  动态规划--------------------------

摘要:【算法】动态规划 【题解】yy出了O(1w log 1w)的算法。 将雪坡排序预处理出g[i]表示能力值为i的最短时长雪坡。 这样就可以定义work(t,c)表示时长t能力c的最多滑雪数量,work(t,c)=t/g[c]。 然后将课程按结束时间排序。 f[i]=f[j]+work(a[i].beg 阅读全文
posted @ 2017-08-31 19:33 ONION_CYC 阅读(264) 评论(0) 推荐(0)
摘要:【算法】动态规划DP 【题解】 题目要求不严格递增或不严格递减。 首先修改后的数字一定是原来出现过的数字,这样就可以离散化。 f[i][j]表示前i个,第i个修改为第j个数字的最小代价,a表示排序后数组,b表示原数组。 f[i][j]=min(f[i-1][k])+abs(b[i]-a[j]) mi 阅读全文
posted @ 2017-08-31 09:27 ONION_CYC 阅读(268) 评论(0) 推荐(0)
摘要:【算法】动态规划 【题解】 万物皆动规,每时每刻都要想着DP!特别是这种明显可以序列递推的题目。 一个简单的思路是f[i]表示前i个选择合法方案(第i个可选可不选)的最大效率 f[i]=max(f[i-1],f[j-2]+sum[j~i]),j=i-k+1~i。 然后就可以把f[j]-sum[j+1 阅读全文
posted @ 2017-08-30 19:40 ONION_CYC 阅读(251) 评论(0) 推荐(0)
摘要:【算法】树型DP||树的重心(贪心) 【题解】 两遍DFS,第一次得到所有节点子树的路径和,第二次给出除了该子树外其它部分的路径和,时时计算答案。 long long!!! #include<cstdio> #include<cstring> #include<algorithm> #include 阅读全文
posted @ 2017-08-30 18:29 ONION_CYC 阅读(209) 评论(0) 推荐(0)
摘要:【算法】DP 【题解】 如果每个排列算一种,则令f[i]表示凑成面值为i的方案数,容易推出f[i]+=f[i-a[j]]。 现在是每个组合才算一种,令f[i][j]第二维表示只使用前j种面值,f[i][j]+=f[i-a[j][k],k=0~j,这样最终算出来的方案就是按一定顺序的,不会重复计算。 阅读全文
posted @ 2017-08-30 16:21 ONION_CYC 阅读(238) 评论(0) 推荐(0)
摘要:【算法】状压DP 【题解】对于上一行的每个状态,每行进行DFS。 #include<cstdio> #include<algorithm> #include<cstring> #define ll long long using namespace std; const int maxn=20,ma 阅读全文
posted @ 2017-08-30 10:14 ONION_CYC 阅读(249) 评论(0) 推荐(0)
摘要:【题意】求最长的出现至少k次的子串。 【算法】后缀数组+单调队列 【题解】求出所有LCP,然后SA上每k个找一个最小值,取所有最小值中的最大值。 移动区间最小值,显然可以用单调队列优化。 注意:队列左闭右开时,访问队尾一定要tail-1。 求LCP时,只能按字符串顺序求才满足O(n)的规律。 #in 阅读全文
posted @ 2017-08-28 20:46 ONION_CYC 阅读(234) 评论(0) 推荐(0)
摘要:【题意】http://www.lydsy.com/JudgeOnline/problem.php?id=4565 【算法】区间DP+状压DP 【题解】 题外话: 区间DP的状态转移特点是一次转移只做一次合并,小合并由小区间做好传递,这样就能处理好复杂的区间问题。 数据范围k这么小而且和01有关,果断 阅读全文
posted @ 2017-08-23 18:41 ONION_CYC 阅读(430) 评论(0) 推荐(0)
摘要:【题意】给定长度为n(<=2*10^5)的字符串,求最短的字典序最小的非子序列字符串。 http://arc081.contest.atcoder.jp/tasks/arc081_c 【算法】字符串DP 【题解】 先考虑计算最短长度,再考虑求字典序最小。 关键在于发掘出【最短的非子序列字符串】具有最 阅读全文
posted @ 2017-08-23 15:18 ONION_CYC 阅读(518) 评论(0) 推荐(0)
摘要:【题意】给定一叠n张扑克牌和各自的ai,bi。每次可以从最上面拿走连续atop张并获得btop的价值,或是把top放到最底,求最大价值。 【算法】背包DP 【题解】本题最大的特点:atop的需求与牌的顺序无关,也即是说可以将拿走连续atop张视为拿走atop张,对于你连续的牌中你不想拿走的只需要找机 阅读全文
posted @ 2017-08-22 18:28 ONION_CYC 阅读(291) 评论(0) 推荐(0)
摘要:【题意】一个2*n的网格,再保证步数最少的情况下,求从任意格出发遍历完所有格的方案数,格子八连通。n<=10000,T<=100。 【算法】递推,DP 【题解】原题链接:蓝桥杯 格子刷油漆(动态规划) 这类题目最重要的是找到一个可以计算所有情况的状态表示。 对于2*x的网格,a[x]表示从左上角出发 阅读全文
posted @ 2017-08-22 18:05 ONION_CYC 阅读(153) 评论(0) 推荐(0)
摘要:【题意】给出a,b,求出[a,b]中各位数字之和能整除原数的数的个数。1 ≤ a ≤ b ≤ 10^18 【算法】数位DP 【题解】 感觉这种方法很暴力啊。 枚举数位和1~162(不能枚举0,不然会模0,相当于除0),记忆化f[pos][sum][val],sum表示当前数位和,val表示数字取模枚 阅读全文
posted @ 2017-08-21 22:28 ONION_CYC 阅读(210) 评论(0) 推荐(0)
摘要:【算法】数位DP 【题意】定义V-number为从左到看单位数字未出现先递增后递减现象的数字,求0~N中满足条件的数字个数。T<=200,lenth(n)<=100 【题解】百度之星2017复赛,作为送分题出现,拿来练数位DP模板了。 位数多,读入记得用字符串。 记忆化要将有关变量全部纳入。 需要取 阅读全文
posted @ 2017-08-21 21:45 ONION_CYC 阅读(469) 评论(0) 推荐(0)
摘要:第一题 模拟送分。 #include<cstdio> #include<cstring> #include<cctype> #include<cmath> #include<algorithm> #define ll long long using namespace std; int read() 阅读全文
posted @ 2017-08-21 12:00 ONION_CYC 阅读(361) 评论(0) 推荐(0)
摘要:【关键字】偏序,数点,树状数组,线段树,扫描线。 因为涉及多种算法,所以整合到一起。 【扫描线】 二维数点,偏序 ★数点问题 ★关于偏序问题的一些总结 扫描线是一维离线的做法的统称,常用于解决k维偏序问题。 离线:将其中一维的询问排序后按顺序处理,从而实现按时间顺序处理的过程中可以O(1)统计空间上 阅读全文
posted @ 2017-08-12 11:11 ONION_CYC 阅读(1012) 评论(0) 推荐(1)
摘要:【算法】DP+线段树求区间max(二维偏序) 【题解】 状态转移方程:f[i]=max(f[j]+v[i]),x[j]<x[i]&&y[j]<y[i]。 观察j的条件限制显然是二维偏序求最大值,套路化地离散化后一维排序+一维线段树即可解决。 最后在f[i]中找max,所以不用恢复原序。 复杂度O(n 阅读全文
posted @ 2017-08-12 07:02 ONION_CYC 阅读(310) 评论(0) 推荐(0)
摘要:【题意】n个数划分成k段,每段的价值为段内不同数字的数量,求最大总价值 【算法】DP+线段树 【题解】 f[i][j]表示前i个数字划分成j段的最大价值。 f[i][j]=max(f[k][j-1]+value(k+1,j)),j-1<=k<i。 暴力复杂度O(n^3*k),预处理value后复杂度 阅读全文
posted @ 2017-08-10 14:38 ONION_CYC 阅读(231) 评论(0) 推荐(0)
摘要:【算法】DP+数学计数 【题意】给出n个点(不同点之间有区别),求出满足下列条件的连边(双向边)方案(对1004535809取模): 1.每条边连接两个不同的点,每两个点之间至多有一条边。 2.不存在三个点a,b,c使三个点间两两可以互相到达且两两之间最短距离相等。 3.边的长度均为1。 n<=20 阅读全文
posted @ 2017-08-07 16:56 ONION_CYC 阅读(271) 评论(0) 推荐(0)
摘要:【算法】区间DP 【题意】平面上有n个点(xi,yi),用最少个数的底边在x轴上且面积为S的矩形覆盖这些点(在边界上也算覆盖),n<=100。 【题解】随机大数据下,贪心几乎没有错误,贪心出奇迹啊! f[i][j][h]表示区间i~j高度>=h的点全部被覆盖的最少矩形。 首先离散化横纵坐标,然后初始 阅读全文
posted @ 2017-08-06 11:15 ONION_CYC 阅读(192) 评论(0) 推荐(0)
摘要:【题意】给你一个串,让你求出k阶回文子串有多少个。k从1到n。k阶子串的定义是:子串本身是回文串,而且它的左半部分也是回文串。 【算法】区间DP 【题解】涉及回文问题的区间DP都可以用类似的写法,就是h[i][j]表示i~j是否回文,然后就可以O(1)判断回文了。 f[i][j]=k表示该字符串是k 阅读全文
posted @ 2017-08-06 11:01 ONION_CYC 阅读(326) 评论(0) 推荐(1)