hdu
Neo__Z
这个作者很懒,什么都没留下…
展开
-
hdu1078 FatMouse and Cheese【记忆化搜索】
题目大意:给一张n*n的地图,每个点上有权值,从(1,1)开始走,每次最多可先同一方向走k步停下,要求每次停下点的权值要大于上次停下点的权值,问所有停下点的权值和最大是多少?(要算(1,1)的权值)。解题思路因为无论用什么方式走到一个点(x,y),在这以后可以走的点都不会受影响,所以可以用记忆化搜索。 dp[x][y]表示从(x,y)开始走所能得到的最大权值和。#include<iostream>原创 2017-10-18 08:19:46 · 217 阅读 · 0 评论 -
hdu 2059 龟兔赛跑【动态规划】
解题思路:不妨把起点和终点都看做一个充电站。 设dp[i]是到第i个加油站所用最短时间。 则:dp[i]=min(dp[j]+t0,dp[j]+t1),0≤\lej<<i; 其中t0是不充电(全用脚蹬)从p[j]到p[i]所用时间,t1是充电从p[j]到p[i]所用时间。 为何没考虑从j不充电开始但还有剩余电量的情况呢?因为它可以看成从更前面一点充电开始所用时。 时间复杂度为O(n2n^2原创 2017-10-13 17:02:23 · 522 阅读 · 0 评论 -
hdu4393 Throw nails【优先队列&&贪心&&模拟】
题目大意:给你n个人,他们在进行一场自行车竞速比赛,每个人在第1s时走Fi米,以后每秒走Si米,一个小孩在仍钉子破坏比赛,每秒他都选最靠前的那个人,如果有多个人,选编号最小的那个,问你这些人依次被破退出比赛的顺序。(1 <= n <= 50000)(0 <= Fi <= 500)(0 < Si <= 100)解题思路:开始时只看到1 <= n <= 50000,一直在想怎么用数据结构做。 后面发现原创 2017-11-01 16:10:55 · 898 阅读 · 0 评论 -
hdu4343 Interval query【贪心+倍增】
题目大意:给定n个数轴上特殊的开区间(l,r),m次询问,每次询问(a,b)之间最多有多少个不想交的特殊区间。(1<=n,m<=100000,0<=l,r,a,b<=1000000000)解题思路:先把区间及询问离散化。由于要求的区间不相交,所以一旦一个区间覆盖了另一个区间,该区间就没有用了,可以去掉。处理时先把区间按l为第一关键字从小到大,r为第二关键字从大到小排序,然后从第一个开始入栈,如果栈顶原创 2017-11-01 20:17:31 · 405 阅读 · 0 评论 -
hdu 5293 Tree chain problem【树状dp+dfs序+树状数组】
题目大意:在一棵树中,给出若干条链和链的权值,求选取不相交的链使得权值和最大。解题思路:树形DP。设dp[i]表示i的子树下的最优权值和,sum[i]表示不考虑i点时子树的最优权值和,即(j是i的儿子),显然dp[i]>=sum[i]。那么问题是考虑i点时dp[i]的值是多少,假设有一条链通过i,且端点a和b都在i的子树里,即LCA(a,b)=i,如果考虑加上这条链的权值,那么a->i, b->i的原创 2017-10-16 14:49:10 · 393 阅读 · 0 评论 -
hdu4616 Game 【树形dp】
题解详见:http://blog.csdn.net/martinue/article/details/51025232 分析透彻。#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<algorithm>#include<cmath>#include<vector>#include<qu原创 2017-10-25 21:23:24 · 299 阅读 · 0 评论 -
hdu4773 Problem of Apollonius【反演变换】
题目大意:给两个相离的圆和一个不在圆上的点O,问经过该点且与两个圆都外切的圆有哪些。解题思路:这个blog解释的挺不错: http://blog.csdn.net/acdreamers/article/details/16966369。 不过本蒟蒻还是理一下自己的思路。首先了解一下反演的定义: 设反演中心为OO,反演半径为RR,那么若有两点P,P′P,P'连线过OO点,且OP∗OP′=R2OP原创 2017-11-28 19:34:48 · 439 阅读 · 0 评论 -
hdu1007 Quoit Design 【计算几何+分治】
题目大意:给出平面上n个点,求最近两点距离的一半。解题思路:很经典的平面分治题。假设我们把所有点按 xx 坐标平均分成了左右两个部分,设平分直线为x=x0x=x_0,那么最近点对(p,q)(p,q)的距离就是下面二者的最小值: (1)p,qp,q同属于左半边或右半边时的最近点对距离。 (2)p,qp,q属于不同区域时的最近点对距离。 对于情况(1),是与原题完全相同的子问题,可以递归处理。设左原创 2017-12-20 21:36:21 · 259 阅读 · 0 评论 -
hdu6096 String【AC自动机】
题目大意:给出一些字符串,给出前缀后缀模式询问,问有多少字符串符合该模式解题思路:之前一直没头绪,看了看dalao的解法,真是奥妙重重。对于每个询问,我们将它变成 后缀+分隔符+前缀 的形式,如询问ab cd变为cd{ab。 对于每个原串,我们也变为 原串+分隔符+原串的形式,如abecd变为abecd{abecd。 这时我们若用询问串匹配原串就刚好只能匹配到题目所要求的一段了。 所以处理后直原创 2017-12-13 10:37:34 · 250 阅读 · 0 评论 -
hdu5564 Clarke and digits【数位dp+矩阵快速幂】
题目大意:求长度在[l,r][l,r]之间的能被7整除且相邻数位之和不为kk的正整数有多少个。 1≤l,r≤1091\le l,r \le10^9解题思路:设f[x][i][j]f[x][i][j]表示第x位为j,模7余数为i的方案数,那么易得转移方程:f[x+1][(i∗10+k)f[x+1][(i*10+k)%7][k]+=f[x][i][j]7][k]+=f[x][i][j]。原创 2018-01-04 21:28:48 · 291 阅读 · 0 评论 -
hdu4117 GRE Words【AC自动机+动态规划+线段树】
题目大意:给定n个字符串,要求按顺序取一些字符串,满足后一个字符串是前一个字符串的子串,要求使得取出的权值和最大。解题思路:先建出AC自动机,设f[i]f[i]表示选第ii个串做结尾的最大价值,那么有: f[i]=max(f[j])+w[i](ji并且j是i的子串)f[i]=max(f[j])+w[i](j找max(f[j])max(f[j])最朴素的方法就是沿着单词ii的每原创 2018-01-23 19:26:15 · 324 阅读 · 0 评论 -
hdu2048 神、上帝以及老天爷【错排问题】【容斥原理】
解题思路:即是求错排数。 先是递推的做法将错排方法数记为D(n)。1. 把第n个元素放在一个位置,比如k,有n-1种方法。2. 编号为k的元素有两种放法。 把它放到位置n。那么对于剩下的n-2个元素,就有D(n-2)种方法。 不把它放到位置n。那么对于剩下的n-1个元素,就有D(n-1)种方法。由此可得递推公式: D(n) = (n-1) *原创 2018-01-07 15:21:01 · 362 阅读 · 0 评论 -
hdu2243考研路茫茫——单词情结 【AC自动机+动态规划+矩阵快速幂】
这道题就是bzoj1030的翻版,那道题题解见这里。还是用总方案数减去一个单词都不包含的方案数,只不过节点很少,不到30个,就可以用矩阵快速幂优化。不过注意要求的是长度小于L的,所以矩阵多开一维记录前缀和,总方案数也变成了260+261+262+……+26L" role="presentation" style="position: relative;">260+2原创 2018-01-25 22:51:57 · 292 阅读 · 0 评论 -
hdu2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活【单调队列优化多重背包】
解题思路:题目就是求裸的多重背包。 朴素的多重背包是O(n3)" role="presentation">O(n3)O(n3)O(n^3),但用单调队列可以优化到O(n2)" role="presentation">O(n2)O(n2)O(n^2). dp方程为: f[j+k∗w[i]]=max(f[j+l∗w[i]]+(k−l)∗原创 2018-02-06 21:04:46 · 314 阅读 · 0 评论 -
hdu6139 Galaxy at War【阶梯Nim】
题目大意:一张n*m的表格上有一些格子有一些水晶球,两个人轮流进行游戏每次选择一个有水晶球的格子,选择其中至少一个水晶球将它右移或者下移,不能出界还有一些格子上有M(Meditations)或者P(pollutant sources),对应的作用为 当你选择的格子上有M时,若你选择移动 t 个水晶球,那么会将2*t 个水晶球平分到可以移动到的格子内 当t个水晶被移动到有P的格子上时...原创 2018-04-08 16:53:17 · 198 阅读 · 0 评论 -
hdu1158 Employment Planning【贪心&dp】
题意: 第一行项目数; 第二行每个工人的Hire Salary Fire money 第三行每个项目需要的人的数量; 工人在hire/fire的时候要付出额外的钱,如果已经hire了还没有fire就一直会付salary求一个最小开支。 开始时以为是说一个人就选被炒了而要领工资,呵呵~; 思路: 很多题解都是dp,但题目中根本没给人的数量,其实可以贪心。。 h:hire的钱 s:原创 2017-10-12 21:17:20 · 298 阅读 · 0 评论 -
hdu1059 Dividing 【多重背包】
解题思路:起初以为多重背包枚举状态会超时,但借鉴了别人的剪枝后就过了, 将价值从大到小枚举,那对于两个价值a1,a2(a1小于a2),当枚举同一级别的弹珠k时,若(a2-a1)%k==0,那a1+x个k可能会等于a2+y个k,而此后a1+z个k(z>x)就一定会等于a2+(y+(z-x))个k。若倒着枚举就可以break剪枝了。详见代码。#include<iostream>#include<cs原创 2017-10-12 17:15:14 · 234 阅读 · 0 评论 -
hdu1042 Max Sum Plus Plus【最大M子段和】
解题思路:题目中也没给m的范围,还O(n),结果只能O(nm)做。 dp[i][j]表示前j个数字分成i段,且a[j]在最后一段的最大和,那么转移方程为: dp[i][j]=max(dp[i][j-1]+a[j],max(dp[i-1][k])+a[j]),i≤\lej≤\len,i-1≤\lek<<j。 但这样时间空间都会超。 注意到dp[i]这一层只能由dp[i-1]一层转移,且max(原创 2017-10-18 10:47:02 · 277 阅读 · 0 评论 -
hdu 1978 How many ways
解题思路:记忆化搜索,dp[x][y]表示从(x,y)走到(n,m)的方案数。#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<algorithm>#include<cmath>#include<queue>#define ll long longusing namespace st原创 2017-10-18 14:42:35 · 223 阅读 · 0 评论 -
hdu1058 Humble Numbers【优先队列】
看起来不像数位dp。 考虑优先队列(最小堆),每次从取堆顶,再将这个数分别乘以2,乘以3,乘以5,乘以7压入队列中。 注意输出时序数的后缀(WA了三遍……)。#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<algorithm>#include<cmath>#include<queu原创 2017-10-18 15:24:54 · 263 阅读 · 0 评论 -
hdu 1421 搬寝室【动态规划】
解题思路:将物品按质量递增排序。 设dp[i][j]表示从前i件物品中拿走j对(j*2<=i)时最小疲劳值。 那么(1)不拿第i件,则dp[i][j]=dp[i-1][j],这个毫无疑问。(2)拿第i件物品,则第i件物品肯定和第i-1件物品一起拿最优,所以dp[i][j]=dp[i-2][j-1]+(w[i]-w[i-1])^2,即从前i-2件中拿j-1对的疲劳值加上拿了最后两件物品的疲劳值。原创 2017-10-18 16:47:40 · 326 阅读 · 0 评论 -
hdu1422 重温世界杯【动态规划】
解题思路:把环拆成2*n的序列,不断减去左边界,加上右边界更新即可。#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<algorithm>#include<cmath>#include<queue>#include<vector>#define ll long longusing原创 2017-10-11 21:52:43 · 1147 阅读 · 1 评论 -
HDU 4745 Two Rabbits【非连续最长回文子序列,区间DP】
题目大意:两只兔子,在n块围成一个环形的石头上跳跃,每块石头有一个权值ai,一只从左往右跳,一只从右往左跳,每跳一次,两只兔子所在的石头的权值都要相等,在一圈内(各自不能超过各自的起点,也不能再次回到起点)它们最多能经过多少个石头(1 <= n <= 1000, 1 <= ai <= 1000)。解题思路:其实就是求一个环中,非连续最长回文子序列的长度。 dp[i][j] = max{ dp[i原创 2017-10-18 22:05:43 · 276 阅读 · 0 评论 -
hdu1074 Doing Homework 【状压dp】
解题思路:就一个状态而言,我们需要知道所有作业是做了还是没做,再看看n≤\le15,所以可以用状压dp。用数字i的二进制表示每项作业做了还是没做。 定义dp[i]有三个域:mi,t,pre,分别表示i状态下最小扣分,对应的时间,和是从哪个状态转移来的(因为要输出方案)。 则dp[i].t=dp[j]+work[k].c,dp[i].mi=min(dp[j].mi+(dp[i].t-work[k]原创 2017-10-12 14:43:15 · 188 阅读 · 0 评论 -
hdu4405 Aeroplane chess 【期望dp】
解题思路:貌似题意是有捷径就走捷径。 那就是裸的期望dp了。 设dp[i]为当前所处位置到目标状态的期望,则当i≥ni\ge n,dp[i]=0。 转移方程为: 有捷径:dp[i]=dp[to[i]]dp[i]=dp[to[i]] 没有捷径:dp[i]=∑dp[i+j]6+1,1≤j≤6dp[i]=\sum \frac{dp[i+j]}{6}+1,1\le j\le 6。 最后dp[0]原创 2017-10-28 11:42:12 · 232 阅读 · 0 评论 -
hdu1502 Regular Words 【dp+高精度加法】
解题思路: f[a][b][c]表示用a个A,b个B,c个C的方案数,其转移方程为: if(b==0)f[a][b][c]=1; else if(c==0)f[a][b][c]=f[a-1][b][c]+f[a][b-1][c]; else f[a][b][c]=f[a-1][b][c]+f[a][b-1][c]+f[a][b][c-1]; 其中1≤\lea≤\len,0≤\leb≤\le原创 2017-10-10 21:36:23 · 315 阅读 · 0 评论 -
hdu3008 Warcraft 【动态规划】【背包问题】
解题思路:我们可以先算出被boss打死的时间m; 设f[i][j]为第i秒后剩余法力值j时对boss的伤害。 由于每秒法力值有回复且有上届,所以用i-1转移到i的方式比较难写,改用i转移到i+1。 转移方程为:f[i+1][x]=max(f[i][j]+c[k]),x=min(j-w[k]+t,100)。 可以将无法到达的状态跳过节省时间,不跳过也对,因为其不优。#include<iostr原创 2017-10-11 18:56:20 · 335 阅读 · 0 评论 -
hdu1501 zipper【记忆化搜索】【动态规划】
题目大意:给三个字符串A,B,C,问A和B能否按顺序组成C;解题思路:冲突关键在于如果C中某字符刚好都等于枚举到的A中字符和B中字符该怎么转移。法一:记忆化搜索。 dp[i][j]表示A枚举到i,B枚举到j时能否匹配成功。#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<algorithm原创 2017-10-11 20:37:04 · 318 阅读 · 0 评论 -
hdu1300 pearls 【dp】
题目大意:给定n种珠宝 每种珠宝两个数据,a[i]代表数量,p[i]代表单价 按 p[i]从小到大排。 购买珠宝时要满足以下购买规则: 单独买:每种珠宝要加上数量10 合并买:可以把连续几种珠宝数量合并,再加上10,单价按照price最大的计算 求出购买所有的珠宝最少要花费多少 解题思路:直接把a[i]合并为前缀和原创 2017-10-11 21:23:32 · 223 阅读 · 0 评论 -
hdu1224 Free DIY Tour【动态规划】
解题思路:动规方程:f[i]=max(f[j]+a[i]),有j到i的边。 输出方案可把每个点记一个前驱pre[i],回溯输出。 多组数据,注意清零,特别是a[n+1]=0。 最后一行不能再打空行,不然要PE。#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<algorithm>#i原创 2017-10-12 09:24:17 · 267 阅读 · 0 评论 -
hdu1080 Human Gene Functions【动态规划】
解题思路:f[ i ] [ j ] 表示匹配完第一条的第 i 个和第二条的第 j 个(均可以与空格进行匹配);① f [ i - 1 ] [ j ] + v (第一条第 i 个与空格匹配后增加的相似度) ,当该值大于 f 原值时就用它优化 f;② f [ i ] [ j - 1 ] + v (第二条第 j 个与空格匹配后增加的相似度) ,当该值大于 f 原值时就用它优化 f;③ f [ i - 1原创 2017-10-12 15:50:00 · 256 阅读 · 0 评论 -
hdu4352 XHXJ's LIS【数位dp】
题目大意:定义f(i)表示将i看成字符串的最长上升子序列长度。 给定l,r,k,求满足l<=i<=r且f(i)=k的个数。 1<=l<=r<=10^18,1<=k<=10,T<=10000。解题思路:注意是最长上升序列,如果是不下降序列就无法做了。 回忆O(nlogn)求 LIS 的过程,维护一个上升序列,每次新加一个数的时候,...原创 2018-05-17 14:27:23 · 184 阅读 · 0 评论