ACM-动态规划
暗金色
这个作者很懒,什么都没留下…
展开
-
UVALive - 4727 Jump 约瑟夫环
题目大意:给出一个约瑟夫环,从1开始到n,现给出一个k,数到k表示要退出,现在要你求输出最后面的三个数解题思路:这题有一个公式,具体就不在阐述了,可以百度以下:约瑟夫环的数学优化这里讲一下如果求最后的三个数如何求,由递归公式得,首先要初始化f[i],然后再由f[i]往上递归到f[n],得到的这个f[n]表示的其实是倒数第i个数的值也就是说如果要求倒数第一个数的值,就要初始化f[1],然原创 2015-03-10 20:44:48 · 643 阅读 · 0 评论 -
HDU - 5067 Harry And Dig Machine (bfs + 状态压缩)
题目大意:有一个n*m的网格,网格上面有k个地方有石头,现在要求从左上角出发,遍历所有有石头的地方,然后回到左上角,问最短距离是多少解题思路:因为石头的总数小于等于10,所以可以进行压缩 设dp[i][j][state]表示在(i,j)位置,遍历的石头状态为state,走的最小距离,直接bfs即可#include <cstdio>#include <cstring>#include <algo原创 2015-07-24 16:04:05 · 796 阅读 · 0 评论 -
HDU - 1160 FatMouse's Speed(DAG)
题目大意:给出N只老鼠的体重和速度 要求你找出最多的老鼠,这些老鼠满足体重递增,速度递减解题思路:DAG裸题#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int N = 100010;const int INF = 0x3f3f3f3f;struct Mouse{原创 2015-09-26 10:38:42 · 366 阅读 · 0 评论 -
POJ - 3616 Milking Time(DAG)
题目大意:给出N头牛的产奶时间段和产奶量,每接完一头牛的奶后,需要休息R分钟 问如何选择牛,才能使接到的产奶量达到最大解题思路:DAG,按产奶的结束时间大小排序#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int N = 1010;struct Interval{ i原创 2015-09-26 10:44:00 · 364 阅读 · 0 评论 -
HDU - 1087 Super Jumping! Jumping! Jumping!(DAG)
题目大意:有N个数字,要求你求出最大递增和解题思路:DAG裸题#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int N = 1010;int n;int num[N];int dp[N];void init() { for (int i = 0; i < n; i+原创 2015-09-26 10:10:37 · 333 阅读 · 0 评论 -
POJ - 1458 Common Subsequence(最长公共子序列)
题目大意:求两个字符串的最长公共子序列解题思路:裸题#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int N = 1010;char str1[N], str2[N];int dp[N][N];void solve() { memset(dp, 0, sizeof(d原创 2015-09-26 10:39:55 · 406 阅读 · 0 评论 -
HDU - 1069 Monkey and Banana(DAG)
题目大意:给你N种积木,每种的数量不限,现在要求你求出能用这些积木堆出的最大高度 堆的规则如下:在底下的积木的的长和宽要大于在其上面的所有积木的长和宽解题思路:一种积木有6种摆放方式,所以先预处理出每种积木的所有摆放方式 因为长宽限制,所以每种积木的每种摆放方式最多只有一块 接着排个序,按照面积排序,接下来就是纯DAG问题了#include <cstdio>#include <cstring原创 2015-09-26 10:08:01 · 697 阅读 · 0 评论 -
HDU - 1024 Max Sum Plus Plus(DP + 滚动数组)
题目大意:求m个不相交区间的最大和解题思路:这题是参考别人的,传送门再自己组织一下,用dp[i][j]表示前j个数组组成了i个不相交区间的最大和,其中第j个数字一定在某个区间内 那现在要决策的是,第j个数组是在和别的数组成了一个区间,还是自己独立成了一个区间 1.如果是在和别的数组成了区间,那么dp[i][j] = dp[i][j - 1] + num[j] 2.如果是独立的区间,那么dp[i原创 2015-09-26 09:59:23 · 454 阅读 · 0 评论 -
HDU - 1257 最少拦截系统(最少下降序列 + 贪心)
题目大意:给出N个数,要求你找出最少的下降序列解题思路:用一个数组纪录每个下降序列的最小值 如果新来的数字大于数组中的最大值,那么下降序列的数量加1,并将该数加入数组 如果新来的数小于数组中的最大值,那就将数组中的第一个大于它的数替换成该数 用到了贪心思想#include <cstdio>#include <cstring>#include <algorithm>using namesp原创 2015-09-26 10:36:46 · 429 阅读 · 0 评论 -
POJ - 2533 Longest Ordered Subsequence(最长上升子序列)
题目大意:求最长上升子序列解题思路:裸题#include <cstdio>#include <cstring>const int N = 1010;int num[N];int n;int find(int r, int t) { int l = 0, mid; while (l < r) { int mid = (l + r) / 2; if原创 2015-09-26 10:41:05 · 351 阅读 · 0 评论 -
HDU - 2224 The shortest path (双调欧几里德旅行商问题)
解题思路:可以去看一下有关于双调欧几里德旅行商问题的文章,我这里只是讲解一下为什么最后输出的是dp[n][n-1] + dis[n][n-1],解决上次没有解决的问题本来到最后面,要求的dp[n][n] = min(dp[i][n] + dis[i][n]) 因为 dp[i][n] = dp[i][n - 1] + dis[n][n-1] 所以 dp[n][n] = min(dp[i][n -原创 2015-07-24 10:36:35 · 797 阅读 · 0 评论 -
POJ - 1739 Tony's Tour (单回路插头dp)
题目大意:给出一张图,要求从左下角走到右下角,且所有的非障碍点都走一次,问有多少种方法解题思路:在后面加上两行就可以当成单回路插头DP了 比如 … … .#. 后面加上两行后,就变成了饿 … … .#. .#. … 加的后面的两行只有一条路径#include<cstdio>#include<cstring>#include<algorithm>using namespac原创 2015-07-21 14:38:09 · 914 阅读 · 1 评论 -
UVALive - 2031 Dance Dance Revolution 三维dp
题目大意:有一个胖子在玩跳舞机,刚开始的位置在(0,0),跳舞机有四个方向键,上左下右分别对应1,2,3,4.现在有以下规则 1.如果从0位置移动到任意四个位置,消耗能量2 2.如果从非0位置跳到相邻的位置,如1跳到2或4,消耗能量3 3.如果从非0位置跳到对面的位置,如2跳到4,消耗能量4 4.如果跳同一个位置,消耗能量1 5.两只脚不能在同一个位置解题思路:这题其实很水,直接暴力就可以原创 2015-07-12 18:21:15 · 1025 阅读 · 0 评论 -
POJ - 1170 Shopping Offers (五维DP)
题目大意:有一个人要买b件商品,给出每件商品的编号,价格和数量,恰逢商店打折,有s种打折方式。问怎么才能使买的价格达到最低解题思路:最多只有五种商品,且每件商品最多只有5个,所以可以用5维dp来表示,每个维度都代表一件商品的数量 打折的方式其实有b + s种,将每种商品单件卖的也算一种打折方式 这题有个坑点,就是b或者s有可能为0#include<cstdio>#include<cstring原创 2015-07-16 00:59:06 · 961 阅读 · 0 评论 -
POJ - 1125 Stockbroker Grapevine (动态规划理解floyd)
题目大意:有一个,想要在最短的时间內将一个谣言散发给所有人,但是他只能将这个谣言告诉给一个人,然后通过这个人传播出去。问,他应该告诉哪个人,让所有人都听到这个谣言的最短时间是多少解题思路:这题很容易想到用floyd求出每个点之间的最短路。 做这题时,已经很久没做最短路的了,所以一时写不出floyd。发现自己太依赖模版了,所以在这里想写一下自己对floyd的理解(借鉴了这里写链接内容)好让自己下次不原创 2015-07-18 19:56:22 · 809 阅读 · 0 评论 -
POJ - 1018 Communication System (暴力)
题目大意:要买n个零件,每个零件可以由m个厂家提供,每个零件都有相应的b值和p值。(每个零件只能买一个)现在要求你求出最大的min(b) /sum(p) min(b)表示的是每个零件的最小b值 sum(p)表示的是每个零件的p值的和解题思路:直接暴力#include<cstdio>#include<algorithm>#include<cstring>using namespace std原创 2015-07-17 20:09:55 · 800 阅读 · 0 评论 -
POJ - 3257 Cow Roller Coaster (背包)
题目大意:要用N种材料建一条长为L的路,现在给出每种材料的长度w,起始地点x,发费c和耐久度f 问:在预算为B的情况下,建好这条路的最大耐久度是多少解题思路:背包问题 dp[i][j]表示起始地点为i,发费为j的最大耐久度 可得转移方程 dp[i + w][j + c] = max(dp[i + w][j + c],dp[i][j] + f)#include<cstdio>#include原创 2015-07-18 14:49:48 · 974 阅读 · 0 评论 -
HDU - 1693 Eat the Trees(多回路插头DP)
题目大意:要求你将所有非障碍格子都走一遍,形成回路(可以多回路),问有多少种方法解题思路: 参考基于连通性状态压缩的动态规划问题 - 陈丹琦以下为代码#include<cstdio>#include<algorithm>#include<cstring>using namespace std;#define N 12#define S (1 << 12)int n, m;long l原创 2015-07-21 12:55:55 · 1317 阅读 · 0 评论 -
URAL - 1519 Formula 1 (插头DP)
这里写链接内容刚开始学插头dp好吃力,看了别人的代码有点看不懂,所以就参考了别人的代码,写了注释,希望有帮助 如果看不懂可以问//下面所说的情况全在论文中的第13页#include<cstdio>#include<cstring>#include<algorithm>using namespace std;#define N 13#define S1 14000#define S2原创 2015-07-20 17:33:48 · 816 阅读 · 0 评论 -
HDU - 3681 Prison Break(状态压缩 + 最短路)
题目大意:有一个机器人想越狱,越狱的要求是将所有的电网开关关掉。现在给出一个地图,’S’表示空地,‘F‘表示起始地点,‘G‘表示充电池,‘D‘表示禁地,‘Y‘开关 充电池可以将机器人的电充满。机器人每走一格就需要耗掉1点能量,问机器人的起始能量至少要是多少才可以逃出监狱解题思路:先将所有能连通的点连通起来,将充电池和开关抽象出来,压缩成一个状态 求出每个充电池和开关之间的两两间的最短距离,接着二原创 2015-08-01 23:53:25 · 894 阅读 · 0 评论 -
HDU - 4293 Groups (DP)
题目大意:有N个人,人人之间可以组成一个团队,现在N个人各说一句话,说自己前面有多少人,后面有多少人 现在要求你判断这N个人中最多有多少人说真话解题思路:参考了别人的 设有n个人,其中有一个人说了他前面有a个人,后面有b个人,那么他所在的区间就变成了[a + 1, n - b],那么就可以将这个人归到[a + 1, n - b] 如果[a + 1, n - b]的区间的人数超过了 n - a原创 2015-08-01 00:25:50 · 802 阅读 · 0 评论 -
HDU 5479 Scaena Felix(DP)
题目大意:给出一系列的由’(‘和’)’ 组成的字符串,现有一种操作,可以将括号的方向变反,但需要花费1 现在问,需要花费多少的代价才能使该字符串的任意一个连续子串都不存在”()”的配对解题思路:用dp[i][0]表示第i个位置变成’(‘的代价,dp[i][1]表示第i个位置变成’)’的代价 如果当前字符是’(‘的话, dp[i][0] = min(dp[i - 1][1], dp[i - 1]原创 2015-09-27 10:49:10 · 454 阅读 · 0 评论 -
POJ - 3186 Treats for the Cows(DP)
题目大意:给你一个数组,每次你可以取两个数中的一个进行操作,要么取数组的第一个,要么数组的最后一个(取完之后,该数删除) 假设取出来的数组组成了A 现在要求使Sum = A[1] * 1 + A[2] * 2 + A[3] * 3 … + A[n] * n达到最大解题思路:用dp[i][j]表示前面取了i个,后面取了j个最大值 则转移方程dp[i][j] = max(dp[0][i + j -原创 2015-09-28 22:41:39 · 497 阅读 · 0 评论 -
POJ - 1661 Help Jimmy(DP)
题目大意:中文题解题思路:因为是垂直下降,所以就可以将问题转变成从降落的平台到地面的最小时间 因为只能从平台的左边或者右边才可以离开平台,所以可以分别计算出从左边和从右边到达地面的最短时间,并记录#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int N = 2010;con原创 2015-09-28 22:47:05 · 393 阅读 · 0 评论 -
LightOJ - 1110 An Easy LCS(LCS)
题目大意:问你两个字符串的LCS,并输出最小字典序的LCS解题思路:按照LCS的思路,找寻的时候并判断字典序即可#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int N = 110;char s1[N], s2[N];int len1, len2, cas = 1;int原创 2015-10-31 23:00:06 · 430 阅读 · 0 评论 -
LightOJ - 1122 Digit Count(DP)
题目大意:给你M种数,要求使用这M种数组成N位整数,使得该数的每位和相邻位的数的差不超过2解题思路:用dp[i][m]表示组成了i位的数,最后一位是m的情况有多少种 接着得到转移dp,dp[i][m] += dp[i - 1][k] , abs(m - k) <= 2#include <cstdio>#include <queue>#include <cstring>#include <cs原创 2015-10-31 23:07:22 · 738 阅读 · 0 评论 -
LightOJ - 1201 A Perfect Murder(树形DP)
题目大意:有N只蚊子,蚊子之间有相应的关系,假设蚊子为点,关系为边,则蚊子可以组成K棵无根树,注意,不是1棵 现在你的任务是干掉蚊子,但是有一个限制,杀了该蚊子后,和该蚊子直连的蚊子都不能杀,在这种情况下,最多杀几只蚊子解题思路:树形DP,用dp[i][0]表示不杀该蚊子,还能杀多少只蚊子 dp[i][1]表示杀掉该蚊子后,还能杀多少只蚊子 则dp[i][0] += max(dp[j][0],原创 2015-10-31 23:42:53 · 414 阅读 · 0 评论 -
LightOJ - 1125 Divisible Group Sums(DP)
题目大意:给你N个数,从中挑选M个,使得M个数的和能被S整除解题思路:用dp[i][j][k][mod]表示前i个数中选出了j个,除数为k,余数为mod的有多少种情况,接着就可以转移了,分两种情况,选和不选进行转移 这里有个坑点,就是给的数有可能是负数,所以要先转正#include <cstdio>#include <cstring>typedef long long LL;const in原创 2015-10-31 23:11:43 · 570 阅读 · 0 评论 -
LightOJ - 1217 Neighbor House (II)(dp)
题目大意:有N个点围成一个环,每个点都有相应的价值。现在要求你挑选点,使得点的价值和最大,但是有一个限制条件,挑选的点不能相邻解题思路:如果不是环的话,就好解决了,用dp[i][0]表示挑选到了第i个,第i个不要的最大价值 dp[i][1]表示挑选到了第i个,要第i个的最大价值现在是环了,那只要讨论一下最大价值里面是否包含了第一个或者最后一个,如果其中一个不包含,则最大价值不变,因为不会违反规则原创 2015-10-31 23:47:50 · 716 阅读 · 0 评论 -
LightOJ - 1126 Building Twin Towers(DP)
题目大意:给你N个积木,要求你使用这N个积木,垒成两个高度相同的塔,问最大的高度是多少解题思路:用dp[i][j]表示使用前i个积木,垒成两座塔,高度差为j,最高的塔的高度 接着就可以转移了,一个是不使用积木,则dp[i][j] = dp[i-1][j] 一个是给最高的塔 dp[i][j + height[i]] = max(dp[i][j + height[i]], dp[i - 1][j]原创 2015-10-31 23:18:02 · 592 阅读 · 0 评论 -
LightOJ - 1180 Software Company(二分+dp)
题目大意:有两个任务,每个任务分成M块,有K个工人,给出每个工人完成每个任务每块所需要花费的时间,问同时完成任务时,至少需要花费多少时间解题思路:用dp[i][j]表示用前i个工人完成第一个任务的j块时,能完成第二个任务的多少块 接着二分时间,再枚举工人,假设枚举到时间为mid,第i个工人,要求完成k块任务 则dp[i][j] = max(dp[i][j], (mid - k * timeA[i原创 2015-10-31 23:34:02 · 678 阅读 · 0 评论 -
LightOJ - 1079 Just another Robbery(背包)
题目大意:给出一个概率P,和N个银行,再给出每个银行的被捕概率和钱的数量,问在被捕概率小于P的情况下,偷到的最多的钱解题思路:用dp[i][j]表示前i个银行,偷盗了j的钱的最低被捕概率,接着进行背包#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int N = 110;con原创 2015-10-31 23:36:36 · 394 阅读 · 0 评论 -
LightOJ - 1060 nth Permutation(计数)
题目大意:给你一个字符串,问这个字符串的字典序排第n的字符串是什么解题思路:计数问题,依此判断每一位即可#include <cstdio>#include <cstring>using namespace std;typedef long long LL;const int N = 30;LL A[N];int cnt[N];char str[N], ans[N];LL k;int原创 2015-10-31 23:01:45 · 605 阅读 · 0 评论 -
HDU - 5119 Happy Matt Friends(DP)
题目大意:给你N个数,问有多少个子集,满足子集内所有数的xor和大于等于M解题思路:用dp[i][j]表示前i个数,xor和为j的情况有多少种 则dp[i][j] = dp[i - 1][j],表示第i个数不选 dp[i][j ^ val[i]] += dp[i][j],表示选了第i个数#include <cstdio>#include <cstring>#include <algorith原创 2015-10-28 23:25:40 · 872 阅读 · 0 评论 -
HDU - 1260 Tickets(DP)
题目大意:有一个人在卖电影票,给出单卖给每个人的时间,和卖给两个连续的人的时间,问卖完所有电影票需要花费的最小时间解题思路:用dp[i]表示卖了i张电影票所要花费的最小时间,得转移方程 dp[i] = min(dp[i - 1] + single[i], dp[i - 2] + double[i])#include <cstdio>#include <cstring>#include <alg原创 2015-09-26 10:24:56 · 359 阅读 · 0 评论 -
POJ - 3666 Making the Grade(DP)
题目大意:给你一个数组A,要求将这个数组变成数组B,使得 Sum(abs(A[i] - B[i]))达到最小,且B是单调的解题思路:因为答案要求输出单调非递增或者单调非递减的的任意一个,那就只考虑单调非递增吧,因为两个的思路是相同的如果要变化的话,且变化的值要达到最小的话,那么只能变成和前一个相同或者和后一个 所以我们先将A数组从大到小排序 用dp[i][j]表示前i个,第i个刚好是A数组中第原创 2015-09-28 22:35:45 · 761 阅读 · 0 评论 -
LightOJ - 1004 Monkey Banana Problem(DP)
题目大意:给你N个格子,每个格子有相应的数字,现在要求你从最上面往下走,走到最下面。每次只能往左下或者右下走 问最后走到的格子的数的总和的最大值解题思路:用dp[i][j]表示走到第i行第j列得到的最大和 因为规则,所以转移方程为dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - 1]) + val[i][j]#include <cstdio>#include原创 2015-10-27 22:27:51 · 405 阅读 · 0 评论 -
LightOJ - 1005 Rooks(统计)
题目大意:给你N*N的格子,要起你在上面放K个车,使得车不互相攻击,问有多少种放置的方法解题思路:如果k > N,那么方法为0 如果k == N,则方法为 k! 如果k < N,则方法为C(n,k) * C(n,k) * k!#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const i原创 2015-10-27 22:31:04 · 430 阅读 · 0 评论 -
LightOJ - 1013 Love Calculator(LCS + DP)
题目大意:给你2个字符串,要求你求出另外一个字符串,这个字符串的子串(可以不连续)包含这两个字符串,且这个字符串的长度要最短,并问,有多少种组成方式解题思路:字符串的最短长度就是两个字符串的长度和-LCS(两个字符串) 接着是求这个字符串有多少种组成方式了 用ans[i][j][k]表示该字符串当前有i个字符,包含了第一个字符串的j个字符,第2个字符串的k个字符的种类数 如果s1[j] = s原创 2015-10-27 22:41:36 · 866 阅读 · 0 评论 -
LightOJ - 1017 Brush (III)
题目大意:有N个污点,每个污点有相应的坐标。现在有一个宽度为w的刷子,刷子可以使用k次,刷的时候,可以横刷到无穷 问最多可以刷掉多少个污点解题思路:先离散化,预处理出每个y坐标的点,并统计一下该同一y坐标下,有多少个点 再处理一下,如果刷子的最下面刚好是该y坐标时,能刷到的所有污点数 接着就是DP了,用dp[i][j]表示刷子使用了i次,第i次刷的时候,刷子的最底部刷的是第j个y坐标的最大污点原创 2015-10-27 22:48:52 · 510 阅读 · 1 评论