动态规划
flowser
you are what you want to be
展开
-
uva1169 - Robotruck
题意: n个垃圾,有其坐标(x,y)即重量w,一机器人最多承受重量C,要按其编号依次去捡垃圾(它只能上下左右走)然后倒垃圾,垃圾桶在原点(0,0),求倒完所有垃圾需走的最小距离。 思路:直接dp的话复杂度O(100000*100)过大,因而用单调队列来优化。 dp[i]表示倒前i个垃圾的最小距离,sumd[i]表示前i个垃圾的曼哈顿距离,sumw[i]表示前i个垃圾的重量和,p[i].d表示i原创 2016-02-13 12:55:48 · 283 阅读 · 0 评论 -
uva11825 - Hackers' Crackdown
题意: 有n台计算机,每台计算机都运行n个服务器,让你去破坏,每台计算机你能破坏一种服务,它和它的邻居们的该台服务都会被破坏,所有计算机的这种服务都被破坏才算这项服务成功破坏,让你求最大能成功破坏多少种服务。 思路: 该问题可转为:把n个集合goup1,2,…n分成尽量多组,使每组中所有集合的并集等于全集。 代码如下:#include <iostream> #include <cstdio>原创 2016-02-13 11:54:16 · 599 阅读 · 0 评论 -
uva10859 - Placing Lampposts
题意: 有n个点m条边的无向无环图,在尽量少的点放灯,让所有边都能被照,且尽量多的边同时被找到。 思路: 题目有两个地方要控制,a:一个是放灯的点——要尽量少,b:第二个是被两盏灯照到的边—-尽量多。 学到一个小技巧,就是将第二问题转为b:被一盏灯照到的边 — 尽量少,所求即x=Ma+b最小,M为一个比a,b大得多的数。 然后就是控制x使其最小了。 代码如下:#include <iost原创 2016-02-13 12:15:22 · 461 阅读 · 0 评论 -
uva10891 - Game of Sum
题意: 给一个序列,AB两人比赛,每人每次只能从左或从右取任意连续数,都足够聪明,极力想让自己赢,A先开始取,让你求A和B都取最优策略时,A-B的得分结果。 思路: 初写dp没多久,式子怎么也推不出来,看了题解,原来是这样的: 让sum[i]表示前i个数总和,要求A-B即求 A - (sum[n]- A),即求2*A-sum[n]。 求A的话,让dp[i][j]表示A在第i~j个数中取到的值,则dp[1][原创 2016-02-13 11:39:21 · 286 阅读 · 0 评论 -
定义区间dp
转载自http://www.cnblogs.com/zsboy/archive/2013/03/08/2950261.html 区间动态规划问题一般都是考虑,对于每段区间,他们的最优值都是由几段更小区间的最优值得到,是分治思想的一种应用,将一个区间问题不断划分为更小的区间直至一个元素组成的区间,枚举他们的组合 ,求合并后的最优值。 设F[i,j](1<=i<=j<=n)表示区间[i,j]内的数字转载 2016-03-10 20:05:54 · 634 阅读 · 0 评论 -
uva10003 - Cutting Sticks(区间dp)
题意: 给你一根木块,让你在n个点切块(不能改变顺序),使得总花费最小,看拿来切的那根木棍的长度。 思路: 拿到题目,不知道怎么推状态方程,怎么切的话总是会往贪心的角度考虑,对dp的感觉还不够,还需多加练习!看了他人的代码,此题可用区间dp,顺便模仿了 “区间dp的定义”,见文->http://blog.csdn.net/conatic/article/details/50849656 代原创 2016-03-10 21:44:21 · 664 阅读 · 0 评论 -
uva674 - - Coin Change
题意: 给你一定金额,让你换成面额分别为50,25,10,5,1的纸币,求所有可换方法之和。 思路: 借鉴了他人的代码,再觉dp刷得少,还没了解透彻!这题的话,总金额可一步一步由上一层求得。 如题例中的26,要求的总方法dp[26][4]=dp[26]3=dp[26-25*0][2]+dp[26-25*1][2] dp[26][2]又等于dp[26-10*0][1]+dp[26-10*1]原创 2016-03-10 22:00:10 · 477 阅读 · 0 评论 -
uva10066 - The Twin Towers(LCS)
题意: 题目意思其实就是给你两串数字,求最长公共子序列 思路: 只是题意变了,其它都没变,跟前面几题最长公共子序列做法完全相同。 代码如下:#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std;const int N = 105; int a[N],原创 2016-03-10 22:03:35 · 376 阅读 · 0 评论 -
最长递增子序列问题
最长递增子序列问题的求解 转自http://www.cnblogs.com/lonelycatcher/archive/2011/07/28/2119123.html最长递增子序列问题是一个很基本、较常见的小问题,但这个问题的求解方法却并不那么显而易见,需要较深入的思考和较好的算法素养才能得出良好的算法。由于这个问题能运用学过的基本的算法分析和设计的方法与思想,能够锻炼设计较复杂算法的思维,我对转载 2016-03-13 23:01:21 · 372 阅读 · 0 评论 -
uva10131 - Is Bigger Smarter?
题意: 给你若干个人的体重(w), IQ(s),让你找出最长的:w越大,s就越小的序列,并打印输出。 思路: 仿照的是最长递增子序列的代码, 可见http://blog.csdn.net/conatic/article/details/50881119代码如下:#include <iostream> #include <cstdio> #include <cstring> #include <a原创 2016-03-13 23:10:59 · 361 阅读 · 0 评论 -
UVA 10192 - Vacation(最长公共子序列)
题意: 和之前的uva10405一模一样 代码:#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int N = 105; int dp[N][N]; char A[N], B[N]; int main() { int cas =原创 2016-03-13 23:18:32 · 412 阅读 · 0 评论 -
UVA 357 - Let Me Count The Ways
题意: 换硬币 思路: 跟uva674 http://blog.csdn.net/conatic/article/details/50850516没什么不同 , 改了long long 即可 代码:#include <iostream> #include<cstdio> #include<cstring> #include <algorithm> using namespace std;原创 2016-03-13 23:25:20 · 435 阅读 · 0 评论 -
UVA 147 - Dollars
题意:思路: 跟之前做的uva674 - Coin Changehttp://blog.csdn.net/conatic/article/details/50850516 是同款题,但这题有几个要注意的地方就是: 1.long long 问题,可能性有可能非常大 2.精度问题,惨死在这里T_T(见代码部分),还是看了人家题解才知道错在这里。 代码如下:#include <iostream>原创 2016-03-13 23:23:05 · 306 阅读 · 0 评论 -
uva10635 - Prince and Princess
题意: 给你两个序列,求最长公共子序列。 思路: 直接LCS会超时,所以将其转为LIS,即将其中一个序列转为单调递增的序列,再遍历,不断更新直至最长。 代码如下:#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std;con原创 2016-02-13 11:21:43 · 310 阅读 · 0 评论 -
uva10405 - Longest Common Subsequence(LCS)
题意: 字符版的最长公共子序列 样例如下: Sample Input bcacbcabbaccbab bccabccbbabacbc a1b2c3d4e zz1yy2xx3ww4vv abcdgh aedfhr abcdefghijklmnopqrstuvwxyz a0b0c0d0e0f0g0h0i0j0k0l0m0n0o0p0q0r0s0t0u0v0w0x0y0z0 abc原创 2016-03-10 17:11:15 · 325 阅读 · 0 评论 -
uva111 - History Grading(最长公共子序列LCS)
题意: 此题 思路: dp , 然后有坑!题目给的是该序列在正确序列的第几位,还要转换一下。 然后还有一点,下述代码AC,但其实有误,有误部分在代码部分会提及。 错误理由见uva10405 代码如下:#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace s原创 2016-03-10 16:59:29 · 411 阅读 · 0 评论 -
uva348 - Optimal Array Multiplication Sequence
题意: 给你一些固定顺序的矩阵(行,列),求它们相乘所得到的最小乘积次数 Sample Input 3 1 5 5 20 20 1 3 5 10 10 20 20 35 6 30 35 35 15 15 5 5 10 10 20 20 25 0 Sample Output Case 1: (A1 x (A2 x A3)) Case 2: ((A1 x A2)原创 2016-03-18 23:16:16 · 277 阅读 · 0 评论 -
uva624 - CD(01背包+打印路径)
题意: 一个数n,及n个数,让你求n个数中取哪些数可更接近n 思路: 01背包,不过要打印路径。 打印路径的话,就看dp[i][j]是否=dp[i-1][j-a[i]]+a[i]],即是不是装了当前背包,装了就j-=a[i],这样从尾向头遍历并标记即可。 代码如下:#include <iostream> #include <cstdio> #include <cstring> #inclu原创 2016-03-18 23:22:16 · 439 阅读 · 0 评论 -
uva 10130 - SuperSale(01背包)
题意: 超市降价,全家m个人,能分别拿重量不超过per[i]的东西,n个物品(价格,重量),每个人一个物品最多拿一个,问全家在承重范围内能拿到东西的总最大价值。 思路: 01背包,思路同前几题。 代码如下:#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace原创 2016-03-18 23:27:00 · 283 阅读 · 0 评论 -
uva531- Compromise(lcs+打印路径)
题意: 给你两段文字,求最大相同单词数。 思路: lcs的代码,+打印 代码如下:#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int N = 105; int dp[N][N]; char a[N][N], b[N][N]; i原创 2016-03-18 23:29:34 · 339 阅读 · 0 评论 -
uva10465- Homer Simpson(完全背包)
题意: 给你数a[1],a[2]和t,让你求x个a[1]+y个a[2]能得到的最接近t的数。 思路: 完全背包题,t为背包最大受重,然后和01背包仅一个不同:01背包内部是逆序,它则为逆序。原因是:之前uva562http://blog.csdn.net/conatic/article/details/50927306 提到的不能用顺序的原因是怕小的硬币影响大的,这里背包可以重复拿,不存在影原创 2016-03-18 23:37:34 · 314 阅读 · 0 评论 -
uva562 - Dividing coins(01背包)
题意: 给你一堆硬币,让你分成两堆,分别给A,B两个人,求两人得到的最小差。 思路: 这题可以用背包写,只要把背包总重量当做sum/2就好,然后就看能选硬币最接近却又不超过sum/2的值为多少。这题原来用二维,dp[i][j]=max(dp[i][j],dp[i-1][j-a[i]]+a[i]),但看到空间上可降低复杂度的方法,就决定以后都用下面这种,d,p[i]表示背包容量为i的时候,能装的原创 2016-03-18 23:03:43 · 822 阅读 · 0 评论 -
uva285 - Longest Run on a Snowboard(二维最长递增子序列)
题意: 给你一二维数组,求最长降序路径 思路: 直接4个方向分别找最长路径,dp[i][j]记录下map[i][j]这个点能找到的最长路径,最后再遍历,看哪个点为起点后能找到最长的路径。再备忘即可。 代码如下:#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespac原创 2016-03-18 23:45:06 · 834 阅读 · 0 评论 -
uva437 - The Tower of Babylon
题意: 给你n个立方体,让你以长宽为底,一个个搭起来(下面的立方体的长和宽必须大于上面的长和宽)求能得到的最长高,立方体能翻来覆去交换长宽高来用。 思路: 一个立方体交换长宽高可变成3种立方体,然后分别存起来后,按长宽高大小排序,dp[i]则表示以第i个立方体为底能获得的最大高。 代码:用#include <iostream> #include <cstdio> #include <cstr原创 2016-03-18 23:51:12 · 358 阅读 · 0 评论 -
uva10404L - Bachet's Game(博弈)
题意: 两个人A.B,给你n个石子,m种取石子方式,每次可选其中一种方式(即取a[i]个石子,1《i《m),然后A先取,谁先取完谁先赢。问谁先赢 思路: 博弈题,T_T不会写,参考了大神做法。博弈的话一方要是赢了,另一方就输。那从A的角度,dp[i]表示,剩下i,A去取的话能赢吗,只要dp[i-a[j]]==0,则dp[1]=1,表示A能赢,如果m种方式尝试后他仍为0,则输,这样0101交替,原创 2016-03-18 23:59:17 · 361 阅读 · 0 评论 -
uva620 - Cellular Structure
题意: 两个人A.B,给你n个石子,m种取石子方式,每次可选其中一种方式(即取a[i]个石子,1《i《m),然后A先取,谁先取完谁先赢。问谁先赢 思路: 博弈题,T_T不会写,参考了大神做法。博弈的话一方要是赢了,另一方就输。那从A的角度,dp[i]表示,剩下i,A去取的话能赢吗,只要dp[i-a[j]]==0,则dp[1]=1,表示A能赢,如果m种方式尝试后他仍为0,则输,这样0101交替,原创 2016-03-19 16:54:02 · 341 阅读 · 0 评论 -
动态规划讲解教程
看到了一篇关于动态规划教程,感觉还挺不错的!作者讲得很生动,遂转了一发。附上原文地址: http://www.cnblogs.com/sdjl/articles/1274312.html通过金矿模型介绍动态规划 对于动态规划,每个刚接触的人都需要一段时间来理解,特别是第一次接触的时候总是想不通为什么这种方法可行,这篇文章就是为了帮助大家理解动态规划,并通过讲解基本的01背包问题来引导读者如转载 2016-02-13 14:09:32 · 363 阅读 · 0 评论