动态规划
vufw_795
Mood decides everything.
展开
-
动态规划学习系列——划分DP(一)
划分型DP,是解决跟划分有关的题目的一种DP思路,个人觉得,是目前接触的DP类型中最难的一种,因为感觉思路并不确定,不过正是不确定,才可以体会到算法的精妙之处。题目链接:wikioi_1017 要求是将一个n位的数分成m部分,使各部分的乘积最大。解题的思路基于一个事实:当前的数可以分成m-1部分,那么加多几位分成m部分不是可以从原来的推出来。从这句差不多是废话的话中我们就可以推出状态转移方程:原创 2015-02-21 14:10:39 · 2503 阅读 · 0 评论 -
sicily 1264(动态规划)
题目链接:sicily 1264解题思路: 状态挺好想的(详见代码),但是得看透这题计算时间开销的本质——预处理,把所有时间开销的可能性处理处理,剩下的就简单了~代码:#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;int n,a[105],r;dou原创 2015-06-05 23:34:59 · 813 阅读 · 0 评论 -
动态规划学习系列——数位DP(练手二)
题目链接:BZOJ 1833解题思路: 非常常规的一道数位DP题目,然而,因为好久没做过题,结果怒调了三个钟。关键的地方在于数字0的处理,我采用的做法是先不考虑特殊的0,处理完别的数字之后,使用直接推公式的方法直接求得0的个数。注意数据范围,得使用long long。代码:#include #include #include #include #include using原创 2015-07-22 01:05:19 · 472 阅读 · 0 评论 -
动态规划学习系列——数位DP(练手三)
题目链接:HDU 3652解题思路: 数位DP,**状态**dp[i][j][k][c]表示 i 位数中,以 j 开头的,模13为k的数的统计情况,其中 c 可取0或者1,0表示不包含13,1表示包含,这样我们就可以把所有的数分成两部分,设计状态转移方程。 1、状态转移方程:dp[i][j][(tmp*j+l)%13][1]+=dp[i-1][k][l][1];if(j==1&&k==3)原创 2015-07-23 15:22:19 · 716 阅读 · 0 评论 -
编辑距离算法——动态规划
概念解释: 编辑距离,又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数,如果它们的距离越大,说明它们越是不同,所以一般会用来表示两个字符串的相似度。允许的操作包括修改一个字符,插入一个字符,删除一个字符。应用范围非常广泛,例如抄袭检测,NLP。 要想知道从一个字符串转成另一个字符串的最少变换次数,我们就需要用一个算法,来求出两个字符串之间的最小编辑距离,...原创 2015-09-22 18:05:56 · 1159 阅读 · 0 评论 -
动态规划学习系列——数位DP(练手四)
题目链接:hihoCoder 1033解题思路: 思路超级简单,就是单纯的数位DP,但是,还是觉得好恶心。需要特殊考虑的就是第一位数字为0的情况,不能直接把状态转移的结果拿出来。 状态:dp[i][j][k+100],i 位数中以 j 开头的数交叉和为k的数量原创 2015-11-28 09:30:21 · 482 阅读 · 0 评论 -
统计回文子序列(动态规划)
dp[i][j]代表区间[ i , j ]中回文子序列的个数……#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#define MOD 100007using namespace std;char st[1005];int a[1005],dp[1005][1005];int main()原创 2015-12-31 16:46:41 · 1145 阅读 · 0 评论 -
URAL 1326(状态压缩DP)
题目链接:URAL 1326解题思路: 状态压缩DP,也就是集合的DP,思路跟TSP问题很相似。需要注意的就是可以买多T^T代码:#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#define INF 0x3f3f3f3fusing namespace std;const int MAXN原创 2016-02-03 23:41:25 · 673 阅读 · 0 评论 -
UVA 11021(概率DP)
题目链接:UVA 11021解题思路:这题算是一道很经典的概率入门题了吧,不过首先得知道可以用pow函数。虽然题目中讲的是K个毛球,但是其实可以考虑一个毛球的情况,之后作K次方即为答案。原创 2016-03-07 15:57:21 · 564 阅读 · 0 评论 -
动态规划学习系列——划分DP(二)
划分型DP第二题,wikioi 1039,与第一题乘积最大思路有所不同。题目要求: 将一个数划分成几部分,问一共有多少种分法。 真 · 解题思路: 其实跟小学奥赛的一些题有点像,我们先来看一个例子: 7 分成 3 部分,有四种办法: 1,1,5;1,2,4;1,3,3;2,2,3 。 我们人脑来考虑问题的时候是怎么想的呢?显然,从1开始,1是第1部分,然后剩下6分成2部分,我们依然是从1原创 2015-02-21 16:08:34 · 1641 阅读 · 0 评论 -
POJ 2096(概率DP)
题目链接:POJ 2096解题思路: 总的来说状态方程还是蛮好想的,每次找bug的时候,有可能会出现四种情况,一是在已经找到bug的系统中找到了旧bug,二是在新的系统中找到旧bug,三是在已经找到bug的系统中找到了新bug,二是在新的系统中找到新bug。于是,状态dp[i][j]表示在 j 个系统中找到 i 个bug需要的天数期望,初始状态dp[0][0]=0,状态转移方程如下:dp[i][j原创 2016-02-24 16:48:31 · 566 阅读 · 0 评论 -
LightOJ 1422(区间DP)
题目链接:LightOJ 1422解题思路: 其实一眼看过去根本没想到是DP,而是画了一个连线图,即两个相同数字之间连一条直线,要求的其实是一个最长不交错序列。后来想到了一种对称的情况,例如样例为”5 1 2 3 2 1”,这样就没解了。但是也因为想到了这种情况,提醒了我这是一道区间DP的题目,于是解法就很简单啦。代码:#include <cstdio>#include <cstring>#i原创 2016-03-28 11:43:51 · 693 阅读 · 0 评论 -
sicily 1019(动态规划)
题目链接:sicily 1019题目分析:恶心的一笔的一道题,不过确实是一道好题。给你一棵树,n个结点,结点间距离为1,每个结点有一个值,第一次走过某个节点获得该结点的值,问用m步遍历树可以获得值的最大值。仔细想想这道题其实这道题并不是特别难,只是之前没有做过类似的题目,所以一时半会儿下不了手。解题思路: 树形DP,什么是树形dp呢?其实不用管那么多的啦,都是动态规划就对了,尤其是这道题原创 2015-04-18 07:19:58 · 589 阅读 · 0 评论 -
sicily 1077(动态规划)
题目链接:这里写链接内容题目分析:一看便知道,这是一个多重背包问题,但是关键不在这里,而在数据量——好大,于是我们需要一种优化——多重背包转0-1背包解题思路: 首先我们考虑第 i 种物品,如果它有num[i]个,那么我们可以把它当成num[i]个物品来看,这样就转成了0-1背包问题。但是,这样没有用啊,时间复杂度并没有得到改善,怎么办呢?我们是在用计算机解决问题,那么就永远离不开二进制,试一下用原创 2015-04-06 21:45:02 · 471 阅读 · 0 评论 -
sicily 1419(动态规划)
题目链接:sicily 1419 解题思路:(一道稍微有点不一样的动态规划题目) 刚开始看到题目就立马想到一种动规的解法,用dp[i][j]表示第 i 个到达第 j 个点,可是这种做法有一个问题——推导下一个点的时候需要用到再上一个点的数据(因为越慢送的牛奶需要花费越多时间),这样时间复杂度就会达到o( n^3 ),必然超时,于是我们可以看出,要解这道题,要解决两个问题: 1)首先要搜遍所有的原创 2015-03-12 22:40:01 · 540 阅读 · 0 评论 -
动态规划学习系列——数位DP(初识)
引入第一次知道数位DP这东西,是在大二新手赛,那时有一道“Cutting Trees”的题目,现在来看就是水题一道,可以用多种方法水过,可惜当时愣是没做出来,其他水题也没做出来,于是被大一虐成翔。抱着学习的态度,我们再来看看这道题。题述多组询问,每组询问A和B,为[A,B]范围内,有多少个数是由一个上升序列组成,例如“1379”,“1234”等等(0 深搜解法因为题目数据挺原创 2015-02-09 19:35:00 · 705 阅读 · 0 评论 -
动态规划学习系列——数位DP(练手一)
大概了解了什么是数位DP,想做几道题练练手,于是找到了这道题: 题目链接:hdu 2089 不要62 题目大意是统计【A,B】区间内没有4并且没有62的数,因为有之前那道题的铺垫,很快想到了解决方法。 思路: 预处理一个dp数组,dp【i,j】代表最高位为 j 的 i 位数满足题述要求的的个数;然后分别统计【0,B】和【0,A-1】区间内满足条件的数——与之前那题类似,不过更简单了,具体来看代原创 2015-02-10 16:08:30 · 1538 阅读 · 0 评论 -
动态规划学习系列——划分DP(三)
划分DP第三题,wikioi 1040,送我n个WA~~~题目大意: 这道题题述有着UVA的特色,够废话,其实就是读入一个长度最大200的字符串(不知道为何要分行输入,完全没有意义啊),分成m部分,使各部分单词量加起来最大 解题思路: 这题划分的部分跟乘积最大那题其实很像,状态转移方程也很容易想到: dp[i][k]=max(dp[i][k],dp[j][k-1]+scnt[j+1][i])原创 2015-02-22 14:13:36 · 1527 阅读 · 0 评论 -
动态规划学习系列——区间DP(一)
学习一个算法,还是从题目开始比较好,我们就从一道经典例题开始: wikioi 1048 石子归并 Description 有n堆石子排成一列,每堆石子有一个重量w[i], 每次合并可以合并相邻的两堆石子,一次合并的代价为两堆石子的重量和w[i]+w[i+1]。问安排怎样的合并顺序,能够使得总合并代价达到最小。 Input Description 第一行一个整数n(n第二行n个整数w原创 2015-02-13 17:13:50 · 5171 阅读 · 0 评论 -
sicily_1221 (0-1背包问题)
题述: 小W发明了一个游戏,他在黑板上写出了一行数字a1,a2,….an,然后给你m个回合的机会,每回合你可以从中选择一个数擦去它,接着剩下来的每个数字ai都要递减一个值bi。如此重复m个回合,所有你擦去的数字之和就是你所得到的分数。要你把这个分数最大化。 输入: 第一行,一个整数n(1<=n<=200),表示数字的个数。 第二行,一个整数m(1<=m<=n),表示回合数。 接下来一行有原创 2015-02-19 23:13:09 · 809 阅读 · 0 评论 -
动态规划学习系列——区间DP(二)
上一篇我们看了区间型DP的一道经典入门题——石子归并,这一次同样是类似的一道题——石子归并2 题目链接:wikioi 2102 题干不同之处在于,现在我们的石子不是排成一列了,而是围成一个环,我们要怎么把问题转化成普通的石子归并呢? 其实这是一种挺常见的算法技巧——变环为列 方法:长度为len的环 —> 长度为2*len的列 为什么这样变换是成立的呢?因为每一种截取顺序都可以在变换后的列出原创 2015-02-15 22:43:57 · 911 阅读 · 0 评论 -
TSP问题——动态规划
Traveling Salesman Problem Description: Time Limit: 4sec Memory Limit:256MB 有编号1到N的N个城市,问从1号城市出发,遍历完所有的城市并最后停留在N号城市的最短路径长度。 Input: 第一行整数 T :T组数据 (T 每个cas原创 2015-01-27 11:29:58 · 4812 阅读 · 0 评论 -
sicily 13602(动态规划)
题目链接: sicily 13602 拿到题目马上就想到动规了,而且应该算是棋盘型的DP,状态转移方程挺好想的,就直接上代码了:#include <bits/stdc++.h>using namespace std;long long dp[35][35]; //注意数据范围int main(){ int n; while(~scanf("%d",&n)&&n)原创 2015-02-27 16:04:30 · 671 阅读 · 0 评论 -
sicily 1176 (动态规划)
题目连接:sicily 1176解题思路: 题目看上去像是一道博弈的题,又像是一道区间型DP的题目(矩阵取数),而它跟矩阵取数的区别就是他是两个人在取数,所以每次对一个区间,我们应分两种情况考虑:第一个人取左边的数和取右边的数,而在分别考虑这两种情况时,我们又要根据贪心法则来获取上一个取数的区间。状态方程有点复杂,直接上代码了:// Problem#: 1176// Submission#: 3原创 2015-03-05 15:30:42 · 645 阅读 · 0 评论 -
LCS问题——动态规划
简述: LCS问题,即最长公共子序列问题,给定两个序列X={x1, x2, …, xm}和Y={y1, y2, …, yn},求X、Y最长的公共子序列。与LIS类似,LCS也是可以不连续的。解题思路:本人觉得在这个问题上算法导论讲的很好,所以在此我主要是整理。 1、首先我们来考虑暴力搜索求解的方法,我们要暴力枚举X的所有子序列,然后再看看是不是也是Y的子序列,这样的方法,显然时间复杂度是指数级的,原创 2015-03-27 20:34:38 · 757 阅读 · 0 评论 -
动态规划——最大子数组
上一篇我们用分治法已经将问题的复杂度降低了许多,但是,我们依旧不满足,于是,我们尝试用动态规划来做这道题。解题思路: 对于这样一个连续和的问题(个人习惯叫做最大连续和),如果我们要用动态规划来解,首先得考虑状态和状态转移方程。如果我们把题述数组看成序列,那么是不是可以用序列DP来考虑呢? 我们不妨考虑一个这样的序列:1,-3,5,-2,4 a[i]表示这个序列的第 i 个元素,dp[i]表示最原创 2015-03-11 22:42:39 · 2168 阅读 · 0 评论 -
大楼扔鸡蛋问题(动态规划)
题目链接:poj 3783题意分析: 经典题,紫书上的一道例题,4+2出了这道原题,我愣是以为是数学题,最后也没做出来。题意是这样的,给你N个鸡蛋(硬度一样),让你测鸡蛋的硬度,测量的方法就是从某栋M层的楼的某一层X上把鸡蛋扔下来,如果鸡蛋碎了,代表他的强度小于X;如果没碎,则强度大于等于X。我们要做的就是不断的从楼上把鸡蛋扔下来,直到找到某一层楼X,从这一层楼扔下来鸡蛋不碎掉,从X+1层扔...原创 2015-07-14 19:49:10 · 7047 阅读 · 7 评论