动态规划
文章平均质量分 61
时光爱客
明天是遥远的,我们只能从当下的努力中嗅出它的味道。
展开
-
hiho 完全背包(动态规划)
题目链接:点击打开还是最经典的完全背包问题,完全背包和01背包还是有区别的,完全背包中每一个物品可以选择多次,最后推出的递推公式跟01背包的基本上算是一样的,还是设一个二维数组dp[][],dp[i+1][j]表示从前i个奖品中选出总奖券不超过j时总价值的最大值,w[]数组表示每个奖品需要的奖券数,v[]数组表示每个奖券的价值;递推关系:|dp[0][j]=0;|dp[i+1][j]=ma原创 2015-04-24 23:30:03 · 703 阅读 · 0 评论 -
poj 1159 Palindrome 最长公共子序列 滚动数组
回到寝室之后没事干,也不知道刷什么题目,来道dp试试,其实我dp没怎么学的,还有图论其实也看了个大概,没有前一段看的那么认真。做题一定要保持专注的,认真认真再认真。思路:其实我自己没想出来是最长公共子序列的,这道题目让求的是加进去几个字符能使原来的序列成为回文串,可以求该串和它的逆序串的最长公共子序列,然后用串的总长度减去它就ok啦,如果按模板开int数组的话会超内存,改成sh原创 2015-08-30 10:20:15 · 1020 阅读 · 0 评论 -
poj 3903 Stock Exchange 最长上升子序列
大致了看上次写的LIS的nlogn写法,基本上吃透了,就是设一个数组d,d[i]表示的上升子序列为i的时候最小的原序列值,比如序列1 4 3 5 2 3的d[3]就是3,表示上升子序列为3的时候序列最大值的最小值是3。然后对每个数二分查找。之前我写那道里面写的挺详细的,不再细说了。代码:#include#include#include#include#include#in原创 2015-08-30 11:17:50 · 683 阅读 · 0 评论 -
uva 674 Coin Change(类似完全背包)
有点类似完全背包,不过最后的容量必须被充满。dp[i][j]表示在前i个物品中选择容量不超过j的最大价值。完全背包转移方程:dp[i][j] = max(dp[i-1][j] , dp[i][j-v[i]]+w[i]) 这道题目设数组dp[i][j]表示用前j个硬币组成i的种类个数,转移方程:dp[i][j] = dp[i-1][j]+dp[i][j-a[i]]因为这里求得是原创 2015-08-11 23:17:31 · 692 阅读 · 1 评论 -
uva 10003 Cutting Sticks 切木条dp
这道题有些类似矩阵连乘,就是区间的问题。设dp[i][j]表示从i到j的最小花费,那么dp[i][j]=min{dp[i][k]+dp[k][j]+a[j]-[i]}(i间得时候小区间已经算出来了,所以符合动态规划的自底向上,而且是最优子结构,这道题我把0和木条长度加到了a数组里面,就是说一共有n+2个点,每两个相邻的点不用切割,初始化为1代码:#include#includ原创 2015-08-12 10:42:11 · 668 阅读 · 0 评论 -
hdu 2602 Bone Collector 01背包
经典的01背包问题,去年集训的时候没有做出来的题目,原来是如此简单。。。思路:dp[i+1][j]代表选前i个骨头总容量不超过j的最大价值,所以可得到状态方程|dp[i+1][j] = dp[i][j](vol[i] > j当前i的容量大于j) ||dp[i+1][j] = max{dp[i][j],dp[i][j-vol[i]]+val[i]}|(当前i的容量小于j,只存在装与原创 2015-08-08 15:36:11 · 645 阅读 · 0 评论 -
NBUT 1580 素数分解dp
这道题目以前就看到过,现在想起来了,补一下题,动态规划还真不好想啊,转移方程如果能想起来的话,基本上就能A了。。思路:先对素数打表,然后设一个数组d[i][j+1]用来表示前j个素数和为i的分解个数,然后我们对第j个素数进行分析,有两种情况,用或者不用,即d[i][j]和d[i-primer[j]][j+1](注意这里可以用多次,所以用了一次后还可以在前j个素数里面选择),然后原创 2015-08-11 12:52:59 · 709 阅读 · 0 评论 -
hdu 1058 Humble Numbers(dp)
看的题解。。。不知道这些方法都是怎么想出来的,好厉害啊,估计我是想不出来的,用b2,b3,b5,b7来分别记录从第几位数开始还没有乘对应的2,3,5,7然后比较,小的数排上就ok了。。。注意有的时候是、会出现乘积相同,所以都得加一,比如2*3和3*2,都得让b2,b3加一。这道题还涉及到了英语上的知识,就是只有11,12,13是序数词时加th,1,2,3,分别是first,second原创 2015-08-10 20:34:06 · 522 阅读 · 0 评论 -
hdu 1257 最少拦截系统 dp
简单的dp,只要把每个系统的导弹当前最低高度保存一下,以后得导弹都用最小值比他大的系统中最小值最小的就ok啦。每次要么更新原来系统最低高度,要么加进去一个新系统。。。代码:#include#include#include#include#include#include#include#include#includeusing namespace std;int c原创 2015-08-10 15:32:10 · 388 阅读 · 0 评论 -
hdu 1025 Constructing Roads In JGShining's Kingdom(最长上升子序列nlogn算法)
学习了最长上升子序列,刚开始学的n^2的方法,然后就超时了,肯定超的,最大值都是500000,平方之后都12位了,所以又开始学nlogn算法,找到了学长党姐的博客orz,看到了rating是浮云。。。确实啊,这些不必太关注,作为一个动力就可以啦。没必要看的太重,重要的事学习知识。思路:这道题目可以先对一行排序,然后对另一行求最长上升子序列。。。n^2算法:序列a[n],设一原创 2015-08-10 13:59:31 · 615 阅读 · 0 评论 -
uva 10405 Longest Common Subsequence(最长公共子序列)
经典的最长公共子序列问题,我刚开始用string敲的,就是为了练练手,没想到竟然wa了,还以为我用错了呢。。。换了字符数还是wa。。。真无语,这么简单的题快把我弄糊涂了,后来听人说是输入可能有空格。。。这是巨坑啊,题上都没说清楚,白白wa了几发。。。就是设一个数组d[i][j]遍历两个字符数组当a[i]==b[j]的时候d[i][j]=d[i-1][j-1]+1。不相等的时候就是d[i][j]=m原创 2015-08-09 14:31:20 · 587 阅读 · 0 评论 -
hdu 1003 Max Sum 最大字段和 dp
今天看了一上午dp,看不太懂啊,dp确实不简单,今天开始学习dp,搜了杭电的dp46道,慢慢来吧,白书上的写的又不太详细,先写几道题目再说。。。题目连接:点击打开链接思路:就是当当前的和是小于0的时候就重新计数,大于或者等于0的时候都相加。。。代码:/* Name: Copyright: Author: Date: 08/08/15 08:41 Descri原创 2015-08-08 15:07:40 · 828 阅读 · 0 评论 -
hdu 5366 The mook jong 动态规划(BC 50 C题)
比赛的时候还是没做出来,BC又是做一题,估计又是要掉分了,慢慢提升,总会终结一题的命运。。。思路:动态规划,然而我刚开始学,并不会做啊。。。先是找规律找了半天,结果啥也没找出来,又开始深搜,结果样例能过,交上超时了,深度太大啊,没有正确估算。。。赛后看了题解,动态规划真是神算法啊,简单几行就搞定了。设一个数组d[n]表示地板总数(n>3)然后列出状态转移方程d[n] = d[n-1原创 2015-08-08 23:22:56 · 937 阅读 · 1 评论 -
poj 1160 post office(邮局)
#include#include#include#include#includeint a[305],res[35][305],cost[305][305];void dp(int v,int p){ for(int i=1;i<=v;i++) res[1][i]=cost[1][i]; for(int i=2;i<=p;i++) for(int j=1;j<=v;j++原创 2015-04-09 10:38:55 · 553 阅读 · 0 评论 -
hihocoder 01背包(动态规划)
hihocoder上面这道01背包是最基础的题我觉得,没有什么变化,这是题目的链接点击打开,就是找到每个变量所对应的经典问题中的变量就可以,上学期看过背包问题,上面的代码也抄了下来,感觉可以做模板了,下面一下思路设一个二维数组dp[i+1][j]表示从前 i 个奖品中选出不超过m的奖券时总价值的最大值,那么把dp[0][j]都初始化为0,然后找出一个递推关系 |dp[i][j原创 2015-04-21 15:32:17 · 646 阅读 · 0 评论 -
poj 1458最长公共子序列
好长时间没写博客了,,,选拔赛已经举办过了,,,虽然不太好吧,但是勉强可以进实验室,以后要多加训练才是,特别是训练好自己的心态上节课老师讲了动态规划,布置了两道题目,这道题是求最长公共子序列的,看懂了算法书上的代码, 也就很容易就写出来了,总结得出的公式0 i=0,j=0c[ i ][ j ]={c[ i-1原创 2015-04-15 22:59:59 · 467 阅读 · 0 评论 -
poj 1159 Palindrome 最长公共子序列
这道题可以用最长公共子序列写,对于需要插入字符的个数,可以总结出一个公式:所需插入的字符个数=总字符个数 - s和s'的最长公共子序列的个数 限制内存是65536k,要是用int开c[5005][5005]的数组会超内存,MLE,看了下别人写的用的short开的那么大的数组,虽然不超内存,但是我觉得short能表示的数在3000多,万一要存入的数是4000多呢,所以我觉得应原创 2015-04-16 19:34:18 · 548 阅读 · 0 评论 -
uva 108 Maximum Sum 最大子矩阵和
不知道为啥,这样的题目跑到贪心里面去了,动态规矩挺简单,最后之前看了一遍他的问题,所以很容易就敲出来了,贪心暂时告一段落,开始dp,加油思路:最大子矩阵和的问题可以通过最大字段和的问题解出来,普通的暴力枚举是枚举行和列,时间复杂度为m^2*n^2,但是我们可以在行的上界和下界确定的情况下将这个矩阵压缩为一个一维数组存起来,然后利用最大字段和的求解解出来,代码应该很容易就能看懂,如果对动原创 2015-08-07 14:20:50 · 733 阅读 · 0 评论