动态规划
文章平均质量分 66
qhpeklh5959
哈工程小白,两个月前正式投入算法学习
展开
-
课业总结……
电脑正在升级系统,我上来稍稍溜达溜达。今天找磊哥给我讲了讲动态规划,真心受益,为了防止以后忘了,总结一下先。磊哥是从寻找一个有向无环图的最短路讲起的,有向无环图的讲法参看《算法导论》,在这里我就不重复说一遍了,因为我实在是没有办法把图画出来。实际上磊哥解决了我的一个疑惑,利用他的经验。做 动态规划题对我来说最为闹心的就是寻找状态,寻找最优子结构,貌似这两个一有困难动态规划的题根本就原创 2012-11-25 16:40:58 · 793 阅读 · 0 评论 -
HDU4632 Palindrome subsequence
HDU莫名其妙上不去了。。这个让我情何以堪。。题意是询问一个字符串中回文子序列的个数,说起来常规的回文子串变一变就是这道题的解法,果断还是dp走起。dp[i][j]表示的是[i, j]区间内不同的回文子序列的个数,那么它来自于左边往后一位,右边往前一位的答案,也就是说,dp[i][j]=dp[i+1][j]+dp[i][j-1]-dp[i+1][j-1],然后如果s[i]=s[j],表明[原创 2013-08-02 01:02:25 · 528 阅读 · 0 评论 -
Codeforces Round#186(Div 2) D
题目链接现在看来,DP真的是弱的一逼,看了师父的题解……所以说是转载了dp[i][j]表示的是前i个坑修复了j个所花费的最小的代价,其实友情提示到这里我还是想不到要怎么做不过可以想的是,要么就是前面我们已经修了j个坑了,也就是说,前i-1个坑里面我们已经找出来了j个坑修复了,要么就是存在一个区间[p,i],以p为分界点,分为两个部分修。dp[i][j] = min(dp[i - 1转载 2013-06-01 10:43:34 · 757 阅读 · 0 评论 -
POJ1036 Gangsters
微微发亮的传送门这道题是一到比较水的DP,其实看看就能猜到状态转移方程,因为已经是一个定型。dp[i][j]表示的是当第i分钟门的打开程度为j的时候获得的最大繁荣度,很容易推知方程dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - 1], dp[i - 1][j + 1]) + w,w表示的是这一分钟能够获得的繁荣度,注意处理边界情况。最开始我按照常规原创 2013-05-17 00:15:58 · 646 阅读 · 0 评论 -
HDU1227 Fast Food
题目大意题目链接n个饭店,要建m个仓库,现在给所有饭店之间的距离,问m个仓库怎么建能建的最小?输出最小值解题思路比较经典的动态规划,dp[i][j]表示的是前i个饭店,建j个原料站的最小距离状态转移方程是:dp[i][j] = min(dp[k][j - 1] + w[k, j])其中w[i,k]表示第i个快餐店到k个快餐店之间均没有原料站,而且原料站位于i、k时,i~k个原创 2013-12-02 12:52:37 · 601 阅读 · 0 评论 -
HDU1428 漫步校园
题目大意题目连接中文题意无须赘述解题思路首先,我们可以用广搜把所有点到终点的最短路求出来,然后以这个为条件记忆化搜索就可以了(因为起点打错调试了好久TAT)AC代码#include #include #include #include #include using namespace std;typedef long long ll;struct node原创 2013-12-16 16:41:04 · 685 阅读 · 0 评论 -
TC SRM573 div2 p1000
题目大意给一个矩阵,某些点里面有狼,现在这些狼要在m次移动内都聚合到同一个点上,每次移动只能移动到当前格子的四个相邻的格子内,问有多少种方案让这些狼都移动到相同的点上?解题思路首先,一个非常直观的dp方程能很快想出——dp[k][i][j]表示到[i,j]格子内,经过k次移动,有多少种方案,那么这道题的方程也就很容易能想到,该点的上一个状态一定是相邻的四个点,那么把那四个相邻点的方案算原创 2013-12-16 15:42:02 · 675 阅读 · 0 评论 -
TC SRM599 div2 p950
tc的题意还是非常好理解的,所以也就不再赘述题意。首先,对于这道题,我第一个想的就是组合数公式,首先对所有的字符串进行字典序排序,这样的话,所有的前缀连通块就全都凑到了一起,然后数出来所有的连通块的长度,按照组合数公式往里面套,就可以了,但是组合数取模还是忘了= =于是乎就没有按着这个方法写。另一个方法貌似是dp,说实话,最开始并没有想到dp的这个姿势(果然还是dp太渣渣了)。dp[i原创 2013-12-15 19:45:08 · 1334 阅读 · 0 评论 -
TC SRM590 p1000
题目大意给一个棋盘,由"U”,“D”,"."组成,其中U代表每次只能向上移动若干格子的棋子,D代表每次只能向下移动若干格子的棋子,.代表空点,问最多能移动出来多少种方案。解题思路既然题目中说了棋子只能上下移动,那么列与列之间没有任何的关系,都是独立的,换句话说,我们只需要单独考虑每一列之间的关系然后用乘法原理算出来就行了。每一列之中有多少个方案还是比较好算的,对于U棋子,每一个原创 2013-12-18 18:50:54 · 614 阅读 · 0 评论 -
TC SRM601 div2 p1000
题目大意给三个字符串A,B,C,求一个字符串S,其中,S是A和B的子序列,同时C是S的子串,求S最长的长度解题思路首先,S一定是A和B公共子序列,那么首先求LIS是一定的了,但是问题就在于怎么把C给放进去对于A和B的每一个位置,我们可以依次对C里面的所有字符寻找,知道找到C的尾部,然后将此位置开始,依次匹配完C的所有字符之后的最后一个位置记录下来,如果没有的话就标记为无法匹配,然后原创 2013-12-23 15:34:05 · 877 阅读 · 0 评论 -
UVA10917 A Walk Through the Forest
微微发亮的传送门思路比较简单,就是先求出来所有点到家的最短路,这个非常好求了,把家当做起点,dijkstra还是spfa都可以搞定,假设用d数组来保存最短路,然后对于某一个点A,如果存在一个点B,使得d[A] > d[B],就可以从A走到B,也就是说可以建立一条从A到B的有向边,这样的话,我们就能得到一个新图,只需要求从每一个点到终点有多少种方法即可,动态规划完全可以求出来。#includ原创 2013-08-24 09:57:04 · 533 阅读 · 0 评论 -
UVA11324 The Largest Clique
通往另一个世界的虫洞tarjan缩点+dp求最长路#include #include #include #include using namespace std;struct edge{ int u, v, next;}e[55555];const int N = 1111;int pre[N], lowlink[N], sccno[N], dfs_clock, sc原创 2013-05-29 23:35:24 · 756 阅读 · 0 评论 -
TYVJP1114
不同步其他博客以前的东西了,从现在开始到以后同步这个好了……搭建双塔,貌似是非常有名的一道题,OI的dp[i][j]表示使用前i个水晶块的时候,两座塔的误差为j时两座塔共有的最高高度,对于第i个木块,有三种情况,第一种不放,第二种放在其中挨塔上,此时更新误差值以及共有的最高高度值,第三种情况放在高塔上,此时仅仅更新误差值。#include #include #include原创 2012-11-27 22:37:10 · 399 阅读 · 0 评论 -
POJ1384&HDU1114
声明,此题是一个赤裸裸的完全背包,只是有一个问题我当时没处理掉,那就是……怎么判断到底放没放满,后来我释然了,因为如果把dp数组更新到最大值,如果没放满,dp[v]是更新不了的,尤其还是个min函数,所以此题解了就。#include #include #include #include #include #include using namespace std;#define M原创 2012-11-29 12:40:46 · 448 阅读 · 0 评论 -
POJ3280 Cheapest Palindrome
题目链接:http://poj.org/problem?id=3280题目大意就是给你一个字符串,和字符串中每一个字母删除或者添加所需要付出的代价,问把它变成一个回文字串所需要的最少的代价。首先明确一个问题,如果我们在字符串中某一个位置删除一个字符,那么一定能找到一个等价的添加的方法,所以可以把删除和添加统一到一起,然后这道题的状态就简单了。dp[i][j]表示的是区间[i, j]内形原创 2013-04-08 19:57:30 · 889 阅读 · 0 评论 -
HDU1025 Constructing Roads In JGShining's Kingdom
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1025题意大概就是给你一大堆的城市,左边的数表示这个城市缺什么物资,右边的数表示那个物资从哪个城市往里运,两个城市之间需要链接道路,问不交叉的情况下,最多能连多少条。这道题原本应该是一个最长公共子序列,但是无奈他给的数据范围太大,LCS的做法明显不满足,所以首先我们可以把右边的数映射到左边来,这样就原创 2013-04-09 20:07:05 · 748 阅读 · 0 评论 -
HDU1003 Max Sum && HDU1024 Max Sum Plus Plus
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=10031003是喜闻乐见的最大连续子串和,经典的动态规划题目,经典归经典,我确实是刚刚做……在这道题中,我们需要保证的是在计算过程之中,计算的和是一直增加的,如果碰到了让和减少的元素,直接把和更新为0,并且更新临时首指针,每找到一个更优的解,把真正的首指针和尾指针更新,整个过程中一直保证的是和是递增原创 2013-04-09 18:48:59 · 715 阅读 · 0 评论 -
HDU1272 WHUgirls
传送门二维费用完全背包一枚,写起来真的好费劲啊,需要对两个费用来枚举,并且对两个费用判断,然后写出来了一大坨的状态转移方程,让人想屎……#include #include #include int n, x, y, xx[15], yy[15], w[15], dp[1010][1010];int main(){ int t; scanf("%d", &t);原创 2013-04-17 19:19:44 · 626 阅读 · 0 评论 -
最长公共子序列问题
给定两个序列,求两个序列的最长公共子序列的长度(暂时先列出来长度好了……)如此经典的DP,我竟然现在才弄明白,真心弱爆了,好吧,废话不说了,开始吧。对于两个序列,dp[i][j]表示当第一个序列取前i个元素,第二个序列取前j个元素的时候,最长公共子序列的长度,那么对于此状态,有如下几种推导方式,假设第一个序列是X(x1,x2...xi),第二个序列是Y(y1,y2...yj),如果xi=y原创 2013-05-17 00:46:50 · 790 阅读 · 0 评论 -
POJ1458 Common Subsequence
微微发亮的传送门最长公共子序列长度,找到了原来程序的一个隐藏的bug#include #include #include using namespace std;char x[1111], y[1111];int dp[1111][1111];int main(){ while(~scanf("%s%s", x, y)){ int lx = strlen(x); in原创 2013-05-17 10:11:35 · 543 阅读 · 0 评论 -
HDU1074 Doing Homework 状态压缩DP
题目大意题目链接题目大意就是给N种作业,每种作业都有一个花费时间和截止日期,如果超出截止日期,超出多少天扣多少分,问的是用什么顺序做作业能使得扣得分最少解题思路N等于15,全排列枚举非常不合理。背包,无法求出来顺序。既然N最大是15,数据规模非常小,可以用状态压缩DP来解。dp[i]表示i做i集合里面的作业所能做到的最少扣分,然后设置一个j,表示当前面临的是第j个作业,原创 2013-11-21 19:11:50 · 764 阅读 · 0 评论 -
HDU2089 不要62
中文题意自然不用赘述,原题请戳原创 2014-04-28 00:22:11 · 488 阅读 · 0 评论