动态规划
文章平均质量分 58
HelloWorld10086
追随大神的脚步
展开
-
HDU - 2084 数塔(dp入门)
数塔Description在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少? 已经告诉你了,这是个DP的题目,你能AC吗? Input输入数据首先包括一个整数C,表示测试实例的个数,每个测试实例的第一行是一原创 2014-11-09 19:07:21 · 3005 阅读 · 0 评论 -
UVA - 825 Walking on the Safe Side (dp)
题目大意:给出n,m,现在给出n行,每行有k(k为不定值)个数字,第一个数字代表行数, 后面k - 1个数代表当前行的这个位置不可走, 问有多少路径可以从(1,1)到(n,m),只能向下或向右。解析:可以推出,该最短的路径一定为当前矩阵的行+列,dp[i][j]数组用于保存走到每个格子有多少种情况,dp[i+1][j] += dp[i][j]; dp[i][j+1] += dp[i][j]原创 2014-12-28 13:01:55 · 653 阅读 · 0 评论 -
uva 11081 Strings(递推)
感谢一下学姐的博客 下面的思路主要是参考这篇博客做的。题目大意: 给你三个字符串A,B,C。然后问你用A和B的中一些子串(可以有空串)拼出C的方法数。这里的子串指的是将A,B中去掉一些字符得到新的子串。解析: 在做这题前不妨思考一题,给出A和C,问C可以由多少的A的子串表示,不一样的是这里是可以由两个串来表示了。 看了题解才发现原来应该开三个三维数组 f[i][j][k]原创 2015-02-08 11:11:56 · 530 阅读 · 0 评论 -
UVa 11258 String Partition(DP)
题意: 每组数据由一串不超过200个字符的字符串构成,问把它们分成不超过int类型的数,组合起来最大和是多少?思路: dp[i]表示前i个字符能组成的最大数AC代码#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#include <cstdlib>using namespace std原创 2015-02-23 13:28:01 · 583 阅读 · 0 评论 -
HDU - 5033 Building(单调栈)
BuildingTime Limit: 5000MS Memory Limit: 262144KB 64bit IO Format: %I64d & %I64u[Submit] [Go Back] [Status] DescriptionOnce upon a time Matt went to a smal原创 2014-09-24 16:52:42 · 631 阅读 · 0 评论 -
HDU - 5155 Harry And Magic Box
问题描述一个盒子由n*m个格子组成,有一些格子里会有闪闪发光的宝石。现在有求盒子从左边看过去,每一行都闪烁着光芒,从前面看过去,每一列也都闪烁着光芒。问:盒子里的宝石有多少种分布情况。答案有可能很大,所以输出答案对1000000007取模。输入描述多组输入数据每组数据一行,输入两个数n m表示盒子的大小,0≤n,m≤50输出描述每组数据输出一行,原创 2015-01-06 12:05:18 · 1305 阅读 · 1 评论 -
UVA 10163 - Storage Keepers(dp)
题意: 有n个仓库(最多100个),m个管理员(最多30个), 每个管理员有一个能力值P(接下来的一行有m个数,表示每个管理员的能力值), 每个仓库只能由一个管理员看管,但是每个管理员可以看管k个仓库(但是这个仓库分配到的安全值只有p/k,k=0,1,…),每个月公司都要给看管员工资,雇用的管理员的工资即为他们的能力值p和。 问:使每个仓库的安全值最高的前提下,使的工资总和最小原创 2015-02-25 19:35:11 · 643 阅读 · 0 评论 -
UVa 10911 Forming Quiz Teams(dfs)
题意: 给定n,有2*n个人,分成两人一组的n组,每个人在一个坐标上,要求出所有组的两人距离的和最小。解析:直接暴力求解,详见代码。#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>using namespace std;const int INF = 0x3f3f3f3f;const int原创 2015-02-14 18:27:47 · 498 阅读 · 0 评论 -
UVA 10564 Paths through the Hourglass(递推)
题意: 有一个沙漏,从第一行开始走,每次往下走一行,往左或者往右走一列,不能走出沙漏。 你的目标是让沿途经过的所有整数之和恰好为一个给定的整数。输出符合条件的路径条数。思路: 求路径条数,这很常见,令dp[i][j][s]表示以第i行,j列的元素为起点,累加的和为s的路径条数,从上往下走,只要走到终点,则令终点的值为1,这样就可以反向从终点向起点递推。 状态:dp[i][j原创 2015-02-14 18:49:20 · 526 阅读 · 0 评论 -
UVA 662 Fast Food(dp)
题意: 一条直线马路上有n个餐馆,各个餐馆的坐标为di。 现在要在这n个餐馆中选择k个餐馆用来建造仓库。 没有仓库的餐馆,只能使用附近最近的一个仓库。 问总距离最少的建造方案,并输出。思路: 先进行预处理,sum[i][j]表示在饭店i~j之间建一个停车场,i~j的所有饭店到停车场的距离之和最小。 在饭店i~j之间,选择在(i+j)/2点建造是总距离最小的方案原创 2015-02-14 18:39:47 · 538 阅读 · 0 评论 -
uva 10201 Adventures in Moving - Part IV(dp)
题意: 一辆车从起点走到终点,途中有些加油站,给出每个加油站距离和油价,最后求从起点到终点最小费用,其中在起点有100升油,要求到终点至少也还有100升油。解法: dp[i][j]记录走到第i站升j升油的最小费用,用当前的合法状态去更新后一个状态。 dp[i][j]表示到达第i个加油站剩余油量为j时的最小花费 特殊地,dp[n][j]表示到达终点剩余油量为j时的最小花费原创 2015-02-14 18:16:57 · 583 阅读 · 0 评论 -
CodeChef STRSUB(dp+二分)
题意:(中文题意) https://codechef_shared.s3.amazonaws.com/download/translated/MARCH15/mandarin/STRSUB.pdf解析: 先预处理一个数组pre[],pre[i]表示i这个位置,往前最多能找到哪个位置是满足0和1都不大于k的。 然后以每个位置i为左区间的长度就可以计算出,为 (r - pre[i] +原创 2015-03-09 19:43:07 · 807 阅读 · 0 评论 -
hdu 5225 Tom and permutation(组合数学)
题意: 要求你求出字典序比当前序列小的序列的逆序数的和。解析: 组合数学的问题,这题先要求出n个数的全排列的逆序数的和是多少。 当n = 1,他只有1个排列,然我们现在利用1推出2的组合是多少。 思路是把2往前面1排好的序列内插入,显然也可以插前面和后面。 那么会产生1 2、2 1这两个排列,由于2是最大的数,所以当插入后面的位置时产生的逆序对多0,插在前面的位置原创 2015-05-11 21:48:24 · 631 阅读 · 0 评论 -
Codeforces 558C Amr and Chemistry(dp)
题意: 给你n个数,让你通过下面两种操作,把它们转换为同一个数。求最少的操作数。 1. ai=ai∗2a_i = a_i*2 2. ai=ai/2a_i = a_i/2,向下取整思路: 因为ai<=100000a_i<=100000,因此就可以想到通过处理出所有数转到numnum所需要的最少操作数dp[num],维护dp[num]dp[num]的最小值即可。对于aia_i,我们原创 2015-07-15 16:43:57 · 622 阅读 · 0 评论 -
hdu 5366 The mook jong(dp)
解析: 状态转移方程: dp[i]=dp[i−1]+dp[i−3]+1dp[i]=dp[i-1]+dp[i-3]+1。 dp[i]的含义是到i这个位置为止,有多少种方案数,也就是答案。 因为dp表示的是合法的解,所以之前一定已经至少放了一个木桩了。 dp[i-1]代表的是当前位置i不放木桩, dp[i-3]代表的是当前位置放,因为间隔为2,所以不论前面第三个位置有原创 2015-08-10 16:52:38 · 503 阅读 · 0 评论 -
UVALive 2426 Multiple Morse Matches(kmp+dp)
题意: 将下面给的字符串转成莫斯电码,问完全由下面的字符串转化而成的莫斯电码一共有多少种情况。 解释样例:第一种为ATTACK+DAWNATTACK+DAWN,第二种为AT+TACK+DAWNAT+TACK+DAWN。思路: 先用KMP求出每个小的字符串匹配串的结束位置,然后转化为一个邻接表,求出该邻接表,从1开始到lenT结束共有几条路径。 这里可以用dp来求解,dp公式比较原创 2015-07-17 18:53:48 · 569 阅读 · 0 评论 -
hdu 5375 Gray code(dp)
题意: 给一个二进制码,其中有些位置有问号 可以在问号处填0或者1 转换后的格雷码的第i个位置如果是1,那么就得到a[i]的权值。 问最大能得到多少权值解析: 由二进制码转换为格雷码的公式为将二进制码右移一位然后与原来的二进制码按位异或。 所以开一个dp数组 dp[i][0]表示第i位是0得到的最大值 dp[i][1]表示第i位是1得到的最大值 那原创 2015-08-12 11:04:15 · 535 阅读 · 0 评论 -
UVA 620 Cellular Structure(dfs)
这题真的很难理解,看了别人的解析才明白是在讲什么,其实做起来不算难。题目大意:给定一个细胞链,只有AB两种字母组成。有三种方式,一种是从物到有生成A,一种是在原有的基础上,加上AB,一种是B+原有的字符串+A,O代表是正常的细胞链,最后看一下这个细胞链是否是由这些组合构成的,输出最后的操作。如果不是这三种方式中的一种,那么该细胞链已变异,作为第四种输出。解析:不算dp,原创 2014-12-28 12:53:37 · 661 阅读 · 0 评论 -
UVA 10404 Bachet's Game
题目大意:在桌子上有k个石头,现在有Stan和Qllie在玩一个取石子的游戏,由Stan先行,当一方取得最后一个石子的时候,该方胜利,但是这和普通的取石子游戏不同,该规则是从每次规定的个数中,取石头。问:如果两方都执行完美的操作,那么谁能取得最终的胜利。解析:首先,假设当石头只剩0块时,那么搬运的次数就为0接下来考虑博弈过程,假设A搬动,那么他想赢,就得使从他这次搬动算起到石头最终原创 2014-12-28 12:43:19 · 666 阅读 · 0 评论 -
UVA 10069 Distinct Subsequences(dp+高精度加法)
题意:给定2个字符串a, b,求b在a中出现的次数。要求可以是不连续的,但是b在a中的顺序必须和b以前的一致。思路:类似于数字分解的题目。dp[i][j]表示:b的前j个字符在a的前i个字符中出现的次数。dp[i][j] = dp[i][j-1];if(b[i] == a[j]) dp[i][j] += dp[i-1][j-1];母串:ba原创 2014-12-28 14:11:46 · 686 阅读 · 0 评论 -
UVA 103 Stacking Boxes (DAG上的动态规划)
题目意思:给定n个k维的盒子,问我们能够嵌套的盒子最多有几个,输出个数和嵌套的盒子的编号。解题思路:1. 先将盒子的每个边从小到大进行排序2. 建图,如果一个箱子比另一个箱子小,该边就标记为13. dp求出每点最长的升序的长度4. 取出最长dp数组,输出他的升序序列。原创 2014-10-27 23:40:55 · 685 阅读 · 0 评论 -
UVA - 348 Optimal Array Multiplication Sequence (最优矩阵连乘)
题目大意:给你一些矩阵,你要写一个程式来决定该如何相乘的顺序,使得用到乘法的次数会最少。思路:最优矩阵链乘问题,典型的动态规划题目。该问题的子问题为“把Ai,Ai+1,……,Aj乘起来需要多少次乘法”,如果用dp(i,j)表示这个问题的子问题的值,则状态转移方程:dp(i,j) = min{dp(i,k) + dp(k+1,j) + row(i)*col(k)*col(j)}r原创 2014-11-13 15:20:29 · 741 阅读 · 0 评论 -
UVA - 10003 Cutting Sticks(dp和记忆化搜索两种解法)
题目大意:有一根长度为L的木棍,还有n个切割点的位置(按照从小到大排列)。你的任务是在这些切割点的位置处把木棍切成n+1部分,使得总切割费用最小。每次切割的费用等于被切割木棍的长度。例如,L = 10,切割点为2,4,7。如果按照2,4,7的顺序排序,费用为10+8+6=24,如果按照4,2,7的顺序,费用为10+4+6=20解析:这题有两种解法记忆化搜索和dp,但是状态转原创 2014-10-30 20:23:30 · 1117 阅读 · 0 评论 -
HDU - 1466 计算直线的交点数 (dp)
来自杭电ppt上面的一道题目。n条直线互不平行且无三线共点的最多交点数max=1+2+……(n-1)=n(n-1)/2,所以n=20的话,最大的交点数是190本题是求有多少种交点数:容易列举出N=1,2,3的情况:00,10,2,3如果已知1、第四条与其余直线全部平行 => 无交点;2、第四条与其中两条平行,交点数为(n-1)*1+0=3;3原创 2014-11-02 16:04:44 · 653 阅读 · 0 评论 -
UVA - 108 Maximum Sum(最大子矩阵和)
题目大意:给一个N*N大小的矩阵,每个格子上有一个数字。 求这个矩阵中的子矩阵上面数字之和最小的数字是多少。解析:将二维矩阵转换为一维,再用最大子段和的思想求解,和上题的思想差不多。原创 2014-10-19 15:38:15 · 993 阅读 · 0 评论 -
UVA - 10827 Maximum sum on a torus(dp最大子矩阵和)
题目大意:经典的最大连续和问题的变形,从一串数变成矩阵,且行列首尾相连;解析:1. 如何解决首尾相连的问题,可以将矩阵拓展为原来的4倍。2. 对付矩阵,降维,将多行累加到一行; 假设最大子矩阵的结果为从第r行到k行、从第i列到j列的子矩阵,如下所示(ari表示a[r][i],假设数组下标从1开始): | a11 …… a1i ……a1j ……a1n | |原创 2014-10-19 14:51:24 · 1074 阅读 · 0 评论 -
UVA - 507 - Jill Rides Again (dp最大子段和)
题目大意:Jill喜欢骑自行车,但是自从他的城市有了公交系统后,他就比较少骑车了,于是他买了一个折叠自行车,这样他就可以把自行车带到公交车上,当他下车后,他就可以继续骑车。现在b条道路,每条道路有n个公交站点,两个站点间都有一个喜欢值,现在问你能否求出,哪两个站点间的喜欢值最大,如果有多个最大值,输出其中距离最远的站点。解析:题如果用普通枚举起点和终点的O(n^3)肯定超时原创 2014-10-18 19:57:44 · 920 阅读 · 0 评论 -
codeforces 363B round211 div2 B. Fence
题目大意:题目意思是给你两个整数n, k ( 1表示有n个宽度相同的木板 然后给你一行n个整数代表从1到n个木板的高度h ( 1这些木板是有序的 但是不循环问你要拆除k个连续的木板 而且这k个木板的高度之和为所有可能性中最小时,输出该k个木板第一个木板的序号解析:简单dp,可以开一个数组来记录前i个木板的总和。可以拆除时就是有k个木板的时候开始记其木板总和找最小的,每次读入原创 2014-10-20 15:20:40 · 892 阅读 · 0 评论 -
UVA - 116 Unidirectional TSP(dp+多段图的最短路)
题意:给一个n行m列的整数矩阵,从第一列任何一个位置出发每次往右、右上或右下走一格,最终到达最后一列。要求经过的整数之和最小。整个矩阵是环形的,即第一行的上一行是最后一行,最后一行的下一行是第一行。输出路径上每行的行号。多解时输出字典序最小的。解析:从后往前逆推,dp[i][j]记录,到(i,j)当前整数和最小,再开一个next数组用于保存路径。原创 2014-11-06 15:30:12 · 1030 阅读 · 0 评论 -
UVA 10651 Pebble Solitaire(bfs+hash)
题目大意:给出一个12格的棋盘,'o'代表摆放棋子,'-'代表没有棋子,当满足'-oo'时, 最右边的棋子可以跳到最左边的位子,而中间的棋子则被消除,'o--', 问对于一个给定了的棋盘,通过上述消除棋子的方法最后最少剩几个棋子在棋盘上。解析:这题可以直接暴力解决,方法是bfs+hash判重,对于每种当前的状态,可以衍生出新的状态,把这些状态都push进队列中,用一个变量记录这些状原创 2015-01-06 19:10:07 · 654 阅读 · 0 评论 -
UVA 590 Always on the run(dp)
题意:给定n个城市,k次航班,接下来输入n * (n -1)行,表示第i个城市和其他城市的航班,0表示当日无航班,航班形成周期。要求出正好k次航班,从城市1到城市n,最少需要的钱。思路:dp, dp[k][i] 表示经过k次航班的最小花费,到达哪个城市。i代表时间,j表示起点城市,k表示终点城市,k表示第k次航班。那么当次航班的时间为 now = i %原创 2015-01-07 16:29:47 · 635 阅读 · 0 评论 -
UVA 10271 Chopsticks(dp)
题意:给出n只筷子的长度,在其中取k+8组,每组筷子有三根,两根短的一根长的,求各组短筷子长度差的最小的平方和。解析:考虑动态规划,那么很容易想到如下的状态定义:dp[i][j]表示用前j个数组成i个(x,y,z)数对的最小消耗。考虑状态dp[i][j]:对于x和y,有如下考虑:对于a[j],如果不使用a[j],那么dp[i][j] = dp[i][j-1];如果使原创 2015-01-29 17:20:42 · 656 阅读 · 0 评论 -
UVA 10154 Weights and Measures(dp)
题意:有几只乌龟,每只乌龟有一定的重量与力量。每只乌龟可以背小于它力量的重量(包括它自身的重量)。问最多一共可以有多少只乌龟叠在一起。解析:dp[i]表示托i个乌龟时的最轻重量,不断的去更新重量使其最小。这里要先做好预处理,也就是为最长子序列拍好序。但是按照什么顺序排序呢?这里要用到一点贪心,我们想如果现在有两个乌龟,一个力气大,一个力气小,重力我们先不用管,那么应该把原创 2015-01-30 10:22:49 · 691 阅读 · 0 评论 -
UVA 10313 Pay the Price(数字分解DP)
题目大意:有1到300的价值的硬币,给你一个价值n,后面跟着0~2个数字,0个数字表示你要用1~n个硬币,去凑成价值n,1个数字a表示你要用a枚或者更少的硬币,去凑成这个价值,2个数字a,b表示你用a到b范围内的硬币,去凑成这个价值。输出方法数。思路:dp[i][j] 表示i可以拆分成多少个不大于j的数字组合。有两种情况1. 包括j:dp[i][j] +=原创 2015-02-04 10:54:22 · 1143 阅读 · 0 评论 -
UVA - 10401 Injured Queen Problem(dp)
题意:受伤的皇后只能攻击它这一列的,和它周围的九个格子。给定一个字符串,如果第i个字符是'?'则表示皇后能放在任意位置,否则表示它指定了必须放在哪一行,问有几种放法。思路:dp[i][j]表示(i, j)坐标最多有几种放法,要分两种情况讨论:(1)已经放置棋子,直接考虑放置棋子的行(2)没有放置棋子,枚举当前列上面的所有行dp[i][j]取决于dp[k][j原创 2015-02-04 15:54:50 · 524 阅读 · 0 评论 -
UVA 10285 Longest Run on a Snowboard
题目大意:求矩阵中最长递减路径的长度。解析:有两种解法,一种是dfs,还有一种是dp,因为最大的矩阵为100*100,所以直接暴力dfs就可以过。dp解法:先把点的坐标和数值存于结构体中,然后将结构体从小到大排序,然后按照数值从小到大dp如果当前点周围的高度h[newx][newy] > h[x][y],且dp[x][y] >= dp[newx][newy]那么dp[newx][n原创 2014-12-28 09:03:48 · 618 阅读 · 0 评论 -
hdu 5389 Zero Escape(dp)
题意: 有n个玩家,每个玩家有一个id,id可能相同,然后有两扇门,每扇门有一个数字,当某几个人的数根等于门上的数字的时候,这些人就可以进入这扇门,问n个人对于2扇门,有几种不同的进门方式。 每个人都必须要进一扇门。 数根是将一正整数的各个位数相加(即横向相加),若加完后的值大于10的话,则继续将各位数进行横向相加直到其值小于十为止,或是,将一数字重复做数字和,直到其值小于十为止,则原创 2015-08-13 20:21:33 · 644 阅读 · 0 评论