动态规划
文章平均质量分 72
谢符宝
业精于勤,荒于嬉行成于思,毁于随。
展开
-
hdu4597(区间dp)
题意:给定两个卡片序列,每张卡片都有一定的分数,Alice和Bob轮换从两个序列中拿卡片,每次只能从序列头部或尾部取走卡片。问Alice先取的话,最多可以取到的卡片分数和最多是多少。解法:区间dp,ans[i][j][k][h]表示在第一个卡片子序列i-j,第二个卡片子序列k-h里,先取者最多可以得到的分数。每次取时最多有四种选择,取剩下的ans[i+1][j][k][h]、ans[i原创 2014-01-23 02:39:06 · 934 阅读 · 0 评论 -
poj1141(括号匹配-区间dp)
题意:给一个括号序列,问包含此序列的最短合法括号序列;解法:普通的区间dp,num[i][j]记录的是i-j子序列最少需要补充的括号个数,只是在要记录区间的最优分界点rem[i][j]从而将最短合法括号序列输出,复杂度O(n^3);代码:#include #include #include using namespace std;char s[2004];int nu原创 2014-04-10 23:42:09 · 799 阅读 · 0 评论 -
经典RMQ(poj3264)
题意:随机访问任意区间的极值;ST算法:DP预处理复杂度O(nlogn);以后每次询问复杂度为O(1);(F[i,j]表示从i位置开始,往右2^j个元素中的极值。动规方程F[i,j]=max(F[i,j-1],F[i+2^(j-1),j-1]),当i+2^(j-1)大于序列左端时,则F[i,j]=(F[i,j-1];在访问(a,b)区间时,取j使得2^j刚好小于等于(b-a);然后求得max原创 2014-01-16 16:38:46 · 514 阅读 · 0 评论 -
UVALive 6609(Minimal Subarray Length)维护递增序列|RMQ
题意:给一个整数序列(可能有负数),求最短的连续序列使得序列之和大于等于整数x;解法:第一种是On的复杂度: 我们要的是sum[j]-sum[i]>=x,如果有两个决策j = sum[j'],那么j就是没用的。即维护一个sum[j]递增序列。然后每次可以二分查找,但是这里有个特点就是要得到最近的,可以同时维护一个left指针,left指针用于跟进更原创 2014-05-13 21:47:43 · 1362 阅读 · 0 评论 -
CF(D. Fibonacci Sums)dp计数
题目链接:http://codeforces.com/contest/126/problem/D题意:一个数可以有多种由互不相同的斐波那契数组成的情况;解法:dp,容易证明:每个数通过贪心可以找到一种最少数量的斐波那契数组成方案;然后找到有多少种代替的方案;dp[i][0]表示前i个里面第i个数不动的方案数,dp[i][1]表示前i个里面第i个数下放的方案数,因为下放最多下放到已经原创 2014-06-24 21:15:08 · 751 阅读 · 0 评论 -
poj-2479求最大子序列和(双子序列…
be[i]记录着i之前最大的子序列之和;en[i]记录着i之后的子序列之和;这两个都可以通过O(n)的便利得到;然后枚举分界点,总体O(n)解决之。#include#includeusing namespace std;int rem[50030];int be[50030];int en[50030];int main(){ int n; scanf("%d",原创 2014-01-16 16:38:31 · 1122 阅读 · 0 评论 -
poj1159(回文串)
题意:对于一个字符串,问至少插入几个字符才能使得原串成为回文串。思路:一道没有做过的经典题,将原串翻转,答案为原串长度减掉两字符串的最长公共子串(非连续)长度。int会MLE,由于字符串长度有限,short就够了。原创 2014-01-16 16:39:06 · 774 阅读 · 0 评论 -
acdreamoj1108(The kth number)
题目链接:http://acdream.info/problem?pid=1108题意:n个数的数列,m次查询某个区间出现次数第k多的数出现的次数。n,m解法:这个因为是离线的所以可以先统一处理,然后再输出。可以维护一个left和right指针,pre,pre[i]表示此时区间内出现次数大于等于i的数的种类。为了减少复杂度,关键是left和right的移动方式,即查询区间如何排原创 2014-06-26 20:41:50 · 784 阅读 · 0 评论 -
poj3974(最长回文串)(Manacher算法)
题意:给一个字符串,求连续最长的回文子串的长度。思路:Manacher算法(很高效的线性复杂度)。记得上学期看过,这次又做居然全忘了。。。sad,。,。又看了一遍题解才会敲。贴上题解http://hi.baidu.com/735612658gfy/item/e302f391112dff0b924f4176原创 2014-01-16 16:39:04 · 665 阅读 · 0 评论 -
ural 1143. Electric Path(凸包上最短哈密顿路径)
题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1143题意:逆时针给一个凸包的n(n解法:求最短哈密顿本身是一个NP问题,但是因为是凸包上,可以利用这个做;有一个性质:凸包上的最短哈密顿路径不会出现交叉。所以可以看出来从一点出发,他要么和顺时针相邻点连接,要么和逆时针相邻点相连接;通过这个性质可以通过dp做:ans[i][j原创 2014-06-28 21:02:00 · 1284 阅读 · 0 评论 -
ACdreamoj1110(多重背包)
题意:裸的多重背包,水题。解法:和完全背包一样,只不过加一个数组,记录着每个物品用过的次数,多于存储量时就pass不更新。 还有一种方法是将每个物品用二进制压缩处理,第一个代码比较简单;代码:/******************************************************* author:xiefubao*******原创 2014-06-13 00:23:00 · 867 阅读 · 0 评论 -
zoj3791(An Easy Game) DP
题意:给出两个01字符串s1,s2.每次改变s1上m个位置的字符。问k步之后使得s1变为s2的方法有多少种。解法:DP,关键是状态的设计。考虑还是唯一性和可传递性。dp[i][j]表示第i步后有j个不同到目标的走法数。记忆化搜索dp[0][dif](dif表示初始时不同字符的个数)。转移时候枚举选择情况即可。代码:/*****************************原创 2014-06-02 00:13:48 · 1099 阅读 · 0 评论 -
hdu3689(kmp+dp)
题意:问随机生成一个长度为m(m解法:dp+kmp优化。ans[i][j]表示i长度,走到了s的j位置的概率,当然这是在i之前没有出现s的前提下(在状态转移时候已经保证了这一点);然后最后的概率就是1-m长度的串分别最后出现s的概率之和。代码:/******************************************************* @author:xief原创 2014-11-02 17:37:28 · 1632 阅读 · 0 评论 -
uva437(经典DAG题目)
题意:有n(n解法:其中每种立方体有三种摆放方式,可以将每种转化成三种立方体,因为一个立方体不可能在一个相同的自己上面,所有每种一个就够了。90个点,并且是有向无环的图,求最长路径,可以拓扑排序,也可以dfs。代码:/******************************************************* @author:xiefubao*****原创 2014-11-28 16:04:33 · 827 阅读 · 0 评论 -
hdu5117(数学推导+dp)
题意:有n(n解法:假设一种情况是开灯数是X, X=(x1+x2+x3...xn),xi是第i个灯的开闭情况。则X^3=(x1+x2+x3...xn)*(x1+x2+x3...xn)*(x1+x2+x3...xn)。即求三个灯的三三组合Xi*Xj*Xk,只有Xi,Xj,Xk都为1时候,他们的乘积才是1. dp[i][j][k][state]表示三个灯ijk状态为stat原创 2014-12-01 11:34:09 · 1122 阅读 · 1 评论 -
uva1627(模型转换01背包)
题意:有n(n解法:如果两人不是相互都认识,就连一条无向边。所以就变成了一个无向图。对于每一个连通分量来说,必须是个二分染色图,否则就No solution。然后对于每个联通分量,黑白两种颜色有个数量差,用所有的差来进行01背包,找到距离集合差0最小的方案。代码:/******************************************************原创 2014-12-01 16:31:07 · 1495 阅读 · 0 评论 -
hdu 5136(dp计数)
题目链接题意:直径为K的每个点的边数不超过3的相互不同构的树有多少种?解法:把树的直径拉开,两边就是两棵二叉树了。子问题:一个深度为m的不同构的二叉树有多少种?dp[i]表示深度为i的个数。sum[i]表示dp的前缀和。转移方程就是:dp[i+1]=dp[i]*sum[i-1]+dp[i]+dp[i]*(dp[i]-1)/2;然后回到原问题:如果K是偶数(想象中间有个虚原创 2014-12-04 00:34:09 · 1577 阅读 · 2 评论 -
poj2817(N!的状压DP)
题意:将n个长度最多为10的字符串排列n行,上下对齐位置可以任意平移,将每一行与上一行对齐相同的字符数加起来,问最多总共能有多少个。将最终数量输出。例:5 abc bcd cde aaa bfcde 的结果展示如下:aaa abc bcd cde bfcde解法:方法是状态压缩记忆化搜索。以前做的状态压缩都是对于解集是2^n数量级形式的,做原创 2014-01-19 19:28:39 · 558 阅读 · 0 评论 -
网络寻路 (dp计数)
题目:X 国的一个网络使用若干条线路连接若干个节点。节点间的通信是双向的。某重要数据包,为了安全起见,必须恰好被转发两次到达目的地。该包可能在任意一个节点产生,我们需要知道该网络中一共有多少种不同的转发路径。源地址和目标地址可以相同,但中间节点必须不同。如下图所示的网络。1 -> 2 -> 3 -> 1 是允许的1 -> 2 -> 1 -> 2原创 2014-03-20 23:14:45 · 1118 阅读 · 0 评论 -
poj1948(经典问题-二维背包 求面积最大三角形)
题意:给n(n解法:dp[i][j][k]表示前k个木板是否能够组成两个长度为i,j的组合,当然ij是相互没有重叠部分的。根据三角形的性质知道,i,j都不会大于等于周长的一半,所有取最大800就够了。滚动使用dp[i][j]可以将空间降到二维,为了避免i,j有重复使用同一个木板,从大向小反向dp。代码:/***************************************原创 2014-04-09 00:48:12 · 1754 阅读 · 0 评论 -
hdu4815长春赛C题
题意:n个分数,猴子每个分数都有0.5的可能性得到,现在小老虎想要在至少P的概率上分数不低于猴子,问小老虎至少要多少分。解法:就是一个概率的背包;每一次循环,ans[j]记录着猴子在前i个分数之前得到j分数的概率。转移方程 ans[j]=ans[j-num[i]]*0.5+ans[j]*0.5; (j>=num[i]) ans原创 2014-01-21 13:50:29 · 776 阅读 · 0 评论 -
poj2955(括号匹配DP)
题意:给一个由()[]四种字符任意排列组成的字符串,求最长合法的不连续字串的长度。思路:DP的时候有点倍增的意思,算出来以每个位置开始任意长度内的答案。倍增着算,注意计算一段的时候先判断两头是否可以匹配,然后再枚举分界点来继续松弛。关键给的字符串不超过100,数据太弱了(n^3)的复杂度。代码:#include #include #include using namespa原创 2014-01-16 16:38:59 · 825 阅读 · 0 评论 -
poj2329
题意:给出一个n*n的矩阵,非零的位置不变输出,对于0的位置如果最近的非零位置只有一个则输出那个最近非零值,否则输出0本身。Aij , Apq距离的定义为 |i − p| + |j − q|. 解法:搞了一发dp,从左上到右下,从右下到左上各扫一遍。代码:#include #include #include #include using namespace s原创 2014-01-22 15:28:26 · 800 阅读 · 0 评论 -
NYoj737 石子合并(区间dp)
题意: 有N堆石子排成一排,每堆石子有一定的数量。现要将N堆石子并成为一堆。合并的过程只能每次将相邻的两堆石子堆成一堆,每次合并花费的代价为这两堆石子的和,经过N-1次合并后成为一堆。求出总的代价最小值。解法:动态规划的思想。先求出所有区间长度为2的合并代价,然后再算出长度为3的、4的。。。。n的。复杂度是N^3,貌似楼教的一道同样问题有更快的算法,会尽快去膜拜,。,。,。原创 2014-01-24 14:00:08 · 724 阅读 · 0 评论 -
poj1651 (区间dp)
题意:n个数中,每次选一个数和左右相邻数相乘,并且从中删除。最右边和最左边的数不能选,选数的顺序随意,最后n-2个乘积之和最小是多少.解法:区间dp,记忆化搜索,水题。以此题开始,以后代码风格会变一些,开始尝试使用一些简化代码的预定义了,希望能够提高一点编码速度。代码:/***************************************************** a原创 2014-01-25 14:14:39 · 676 阅读 · 0 评论 -
poj2353
题意:从第一行任意位置开始走到最后一行任意位置。只能向下向左向右走。输出一个最短的路径。解法:DP。从下向上,每行正反遍历搞两次。输出路径的时候乱搞了一发dfs。代码:#include #include #include using namespace std;int num[110][510];int ans[110][510];int N,M;int fin(int a原创 2014-01-17 17:27:13 · 914 阅读 · 0 评论 -
hdu4495 求最大对称直角等腰三角形
题意:给出一个字符矩阵,求出字符矩阵中面积最大的对称直角等腰三角形。 例如: abg bcc gde 的最大结果是左上三角形,面积为6;由于直角等腰三角形有四种朝向。(分别为直角朝左上,左下,右上,右下),所以要计算四种情况的最大值。这里只说第一原创 2014-01-23 01:54:15 · 875 阅读 · 0 评论 -
poj1221
题意:计算出一个数可以划分为多少个单峰回文数序列。解法:DP。num[i][j]记录着数i可以划分为以大于等于j的数开头和结尾的单峰回文数的数量。开始初始化num[0][i]全部为1.转移方程: num[i][j]=1 (i==j) (j==i)原创 2014-01-20 18:38:49 · 1057 阅读 · 0 评论 -
poj1155(树状DP)
题意:电台发射站作为树根节点,向其他节点发射信号,每个叶子节点是一个用户。其余节点都是中转站。每条边都有一个代价费用,每个用户都有自己愿意缴纳的费用,问要使得总代价费用不低于所服务的用户所付出的费用,最多能服务多少个用户。解法:树状DP。num[i][j]记录着i节点为根的子树中服务j个用户(即叶子结点)的最佳费用(收的费用减掉边代价花费)。在转移状态的时候,因为对于一个节点的num[原创 2014-01-21 03:09:19 · 504 阅读 · 0 评论 -
poj3064(组合数学计数Dp)
题意:有T种蚂蚁,每种的数量是Ni,从中取S到B个,问总共有多少种不同的取法,结果模1000000;解法:ans[i][j]记录着在前i种蚂蚁中取j个有多少种取法,转移方程是 ans[i][j]=ans[i-1][j]+ans[i][j-1] when (j原创 2014-01-19 12:27:44 · 658 阅读 · 0 评论 -
404D Minesweeper 1D(记忆化搜索,dp)
题目链接:http://codeforces.com/problemset/problem/404/D题意:扫雷的游戏,给一串字符,'*'代表此处有地雷,'?'代表未知,'0'代表左右有0个,'1'代表左右有1个,'2'代表左右有2个;为给的字符串共有多少种合法的地雷分步情况;解法:dp;ans[i][pre][now]表示i的位置之前一个位置地雷状态是pre(0/1),i位置地雷原创 2014-03-20 14:35:39 · 1065 阅读 · 0 评论 -
poj1692(区间记忆化dp)
题意:上下两行数相连,相等的才可以相连,并且每条线必须且只能与其他一条线相交(要同时满足相交的两条线的数不相等)。问给的两行数最多可以连几条线。解法:ans[i][j]记录着上面i,和下面j下标之后的数中最多可以连多少条,记忆化搜索dfs(0,0)就可以了。搜索时候,如果用到了i,则贪心在下面选相等的。用到j同理。代码:/******************************原创 2014-05-01 14:22:42 · 1289 阅读 · 0 评论 -
poj3257(Cow Roller Coaster)DP
题意:要连出一个从1-L的过山车线,给出n段可选的建设方案。每段都有起始位置,终止位置,代价,和乐趣程度。要实现1-L的长度中,相邻两端要首尾相连,总建设代价控制在B之内,问最多能获得多少乐趣程度。解法:二维dp, num[i][j]记录恰好建设到i并且用掉代价j多能获得的最多乐趣。先将每段可选方案按照位置排序,然后进行转移。最后选max(num[L][i]),i from 0 to原创 2014-05-03 20:14:44 · 1030 阅读 · 0 评论 -
poj3254(Corn Fields)状压dp
题意:在n*m(1解法;很经典的状压模型。先将每一行的合法状态求出来,12的时候最多377个合法状态。然后进行与行之间的状态转移。最坏复杂度12*(377^2)代码:/***************************************************** author:xiefubao*********************************原创 2014-05-03 21:12:04 · 691 阅读 · 0 评论 -
poj3265(Problem Solving) dp
题意:奶牛群有P种问题,每个问题可以在一个月的时间内修复。修复每个问题要付出相应的代价。对于修复第i个问题,修复月开始时候要付出预付Bi,修复完的下个月初要付出Ai。必须按照1-p的顺序修复(可以多个在同一个月修复)。每个月,奶牛们可以产生M的价值,每个月产生的价值只能再下个月使用,不能累计。问最快可以几天完成所有修复。解法:ans[i][j]表示最后一个月(其实是倒数第二个月)修复了原创 2014-05-04 17:17:57 · 1170 阅读 · 0 评论 -
lightoj1061 (N Queen Again)搜索+状压dp
题意:(八皇后问题的变形)给定8个皇后的位置,然后问最少要走几步使得每个皇后之间可以不相互攻击(不在同一行同一列同一斜线)。其中走的过程每步可以横着竖着斜着走多个格子。解法:先枚举所有合法的八皇后局面(总共92种)。然后将给的点对合法八皇后局面进行匹配。dp[i][j]表示合法八皇后前i个点用掉给定八皇后集合的子集j所花费的最小步数。这里的匹配相当于两个集合各八个点,进行一一配对。原来原创 2014-05-08 09:41:24 · 1292 阅读 · 0 评论 -
poj2148(二维背包)
题意:有n个奶牛,每个都有一个s和t值,取奶牛的一个子集并在保证s之和与t之和均大于等于0的情况下,求∑(s+t)最大;解法:将二维转化为一维: 对于每个背包,以s为背包重量,t为背包价值,求出所有容量的包大小所能包含的价值。由于s有负值,所以加上100000;最后在背包容量大于等于0且价值大于等于0里面选择大和就好;代码:/************原创 2014-04-08 17:35:20 · 1128 阅读 · 0 评论 -
poj2411(状态转移,dfs搜索转移)
题目链接题意:用1*2的小矩形拼成n*m(n,m解法:状态压缩,dfs求转移。当前一列的状态确定后,后一列必须用横向的矩形来填补前一列的空白格,所以前一列不为空时,这一列可以选择也为空让下一列来填补,或是本列来个纵向的矩形填补(如果有连续的两个空格的话)。代码:/**********************************************原创 2014-12-04 17:10:03 · 868 阅读 · 0 评论