随笔分类 - 动态规划 一般DP
摘要:【题意】给定一排n根杆高度hi,一个常数C,杆升高x的代价为x^2,相邻两杆之间架设电话线代价为高度差*C,求总代价最小。 【算法】DP+辅助数组优化 【题解】令f[i][j]表示第i根杆高度为j的最小代价。 f[i][j]=min(f[i-1][k]+C*|j-k|+(a[i]-j)^2)。复杂度
阅读全文
摘要:【题目】洛谷10月月赛R1 提高组 【算法】递推DP+树状数组 【题解】列出DP递推方程,然后用树状数组维护前后缀和。 #include<cstdio> #include<cstring> #include<cctype> #include<cmath> #include<algorithm> #d
阅读全文
摘要:【题意】给定n道题,每月末发放工资m,要求从1解到n,每道题需要在当月初付费ai,下月初付费bi,多道题可以安排在同月,求最少月数。 【算法】DP 【题解】参考自:【bzoj1700】Problem Solving 解题 dp by GXZlegend 因为当月的选择同时关系着当月和下月,贪心是错误
阅读全文
摘要:【算法】DP+数学优化 【题意】把n个1~m的数字分成k段,每段的价值为段内不同数字个数的平方,求最小总价值。n,m,ai<=40000 【题解】 参考自:WerKeyTom_FTD 令f[i]表示把前i个数分成若干段的最小价值。 转移中我们定义,从i开始往前到有j个不同的数的最小位置为b[j]。
阅读全文
摘要:【算法】动态规划+组合数学 【题意】有一个h行w列的棋盘,定义一些格子为不能走的黑点,现在要求从左上角走到右下角的方案数。 【题解】 大概能考虑到离散化黑点后,中间的空格子直接用组合数计算。 然后解决容斥问题就很重要了。 定义f[i]为走到第i个黑点且不经过其它黑点的方案数。 f[i]=calc(x
阅读全文
摘要:【题意】n个数字分成k段,每一段的价值是段内不同数字的个数,求最大价值。n<=35000,k<=50。 【算法】分治决策单调+主席树(可持久化线段树) 【题解】 f[i][j]表示前i天分成j段的最大价值。 f[i][j]=max(f[k][j-1]+work(k+1,i)),j-1<=k<i。 首
阅读全文
摘要:【算法】动态规划 【题解】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
阅读全文
摘要:【算法】动态规划DP 【题解】 题目要求不严格递增或不严格递减。 首先修改后的数字一定是原来出现过的数字,这样就可以离散化。 f[i][j]表示前i个,第i个修改为第j个数字的最小代价,a表示排序后数组,b表示原数组。 f[i][j]=min(f[i-1][k])+abs(b[i]-a[j]) mi
阅读全文
摘要:【算法】动态规划 【题解】 万物皆动规,每时每刻都要想着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
阅读全文
摘要:【算法】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,这样最终算出来的方案就是按一定顺序的,不会重复计算。
阅读全文
摘要:【题意】一个2*n的网格,再保证步数最少的情况下,求从任意格出发遍历完所有格的方案数,格子八连通。n<=10000,T<=100。 【算法】递推,DP 【题解】原题链接:蓝桥杯 格子刷油漆(动态规划) 这类题目最重要的是找到一个可以计算所有情况的状态表示。 对于2*x的网格,a[x]表示从左上角出发
阅读全文
摘要:第一题 模拟送分。 #include<cstdio> #include<cstring> #include<cctype> #include<cmath> #include<algorithm> #define ll long long using namespace std; int read()
阅读全文
摘要:【关键字】偏序,数点,树状数组,线段树,扫描线。 因为涉及多种算法,所以整合到一起。 【扫描线】 二维数点,偏序 ★数点问题 ★关于偏序问题的一些总结 扫描线是一维离线的做法的统称,常用于解决k维偏序问题。 离线:将其中一维的询问排序后按顺序处理,从而实现按时间顺序处理的过程中可以O(1)统计空间上
阅读全文
摘要:【算法】DP+线段树求区间max(二维偏序) 【题解】 状态转移方程:f[i]=max(f[j]+v[i]),x[j]<x[i]&&y[j]<y[i]。 观察j的条件限制显然是二维偏序求最大值,套路化地离散化后一维排序+一维线段树即可解决。 最后在f[i]中找max,所以不用恢复原序。 复杂度O(n
阅读全文
摘要:【题意】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后复杂度
阅读全文
摘要:【算法】DP+数学计数 【题意】给出n个点(不同点之间有区别),求出满足下列条件的连边(双向边)方案(对1004535809取模): 1.每条边连接两个不同的点,每两个点之间至多有一条边。 2.不存在三个点a,b,c使三个点间两两可以互相到达且两两之间最短距离相等。 3.边的长度均为1。 n<=20
阅读全文
摘要:第一题 题意:n个点,每个点坐标pi属性ai,从右往左将遇到的点向左ai范围内的点消除,后继续扫描。 现可以在扫描开始前提前消除从右往左任意点,问最少消除数(提前+扫描)。 n,pi,ai<=10^6 题解:很蠢的DP,我好蠢啊…… f[i]表示前i个的最少消除数(不含提前) 从左往右添加,每添加一
阅读全文
摘要:【第一题】 题意: 给一个 01 串设为其 S,询问是否存在只出现两次的 01 串 T。 这里的出现定义为存在一串下标 ,满足 且 。 2≤n≤5000,数据随机。 题解: 很容易想到部分分算法DFS枚举子集。 由于数据随机,n>10时大概率存在,直接输出。 #include<cstdio> #in
阅读全文
摘要:【算法】动态规划 【题解】DP有个特点(递推的特点),就是记录所有可能状态然后按顺序转移。 最优化问题中DP往往占据重要地位。 f[i][j]表示前i头奶牛,第i头改为号码j的最小改动数字,这样每头奶牛改为哪个编号的方案全部记录了,转移可以保证最优。 正反各做一次。 #include<cstdio>
阅读全文
摘要:【算法】DP+斜率优化 【题意】n(n≤50000)块土地,长ai宽bi,可分组购买,每组代价为max(ai)*max(bi),求最小代价。 【题解】 斜率优化:http://www.cnblogs.com/ka200812/archive/2012/08/03/2621345.html 因为对于土
阅读全文