dp
文章平均质量分 65
BIGKAKA
What they have done? What are you doing?
展开
-
校OJ 8597 石子划分问题(dp)
解题思路:1,先将石子重量从小到大排序(从大到小也可以).2,假设f(n,m)表示:n个石头分成m份的最小费用. 特别的,有f(1,1)=0; f(n,1)=(an - a1)^2那么,除去最后一份石头的若干个,前面m-1份必定也是最优的分法.若最后一堆1个石头, f(n,m) = f(n-1,m-1)+0^2若最后一堆2个石头, f(n,m) = f(n-2,m-1)+(an -原创 2015-12-28 11:26:11 · 1645 阅读 · 0 评论 -
挑战P66 有关计数问题的dp
1.划分数有n个相同的物品,将他们划分为不超过m组的划分方法,求出划分方法模M的余数input:4 3ouput:4这是关于整数划分的题目,设dp[i][j]为将i划分为不超过j组的划分方法,则,若任意划分中的ai>0,则对应dp[i-j][j]的划分方法若存在ai==0,则对应dp[i][j-1]所以,dp[i][j]=dp[i-j][j]+dp[i][j原创 2016-03-16 14:45:19 · 542 阅读 · 0 评论 -
nyoj 合并游戏(状态压缩dp)
这道题零零散散的有想了几天时间,可是还是做不出来,始终没有二进制的概念,百度这是状态压缩的题目,因为数据不大,可以利用二进制的方式表示状态,例如当n=3时,101就表示消去第二个石头,1表示未消去,0表示消去,所以可以通过状态111推出101,再例如0101可以从1101,0111推出结果,而dp[0101]保存的是这个转态能取得的最大值。 我们从开始状态开始搜索(例如4个石子:1111),原创 2016-03-05 11:53:34 · 445 阅读 · 0 评论 -
nyoj 硬币找零
完全背包我做的有点多余,别人都是用dp[i]直接保存最小个数,而我却用结构体来保存总数和个数,思路不清晰,逻辑混乱,这是我一大弊端,唉~别人是用dp[i]来表示最小硬币数,如果dp[t]等于INF,则表示不能找零,然后倒退回去找一个不等于INF的数就是剩余最少钱数的硬币数dp[i]=min(dp[i],dp[i-a[j]]+1);#include #include #inclu原创 2016-03-05 15:24:24 · 370 阅读 · 0 评论 -
nyoj 魔法少女(简单dp)
dp(i,0)=min{dp(i-1,1),dp(i-1,0)}+a[i];dp(i,1)=min{dp(i-1,0),dp(i-1,1)};0表示在第i层不飞,1表示在第i层飞,当不飞时,上一层可以飞或者不飞;当飞时,上一层或上两层肯定不飞才能满足条件,感觉自己弱爆了~~自己写出来的还是不是很熟悉~~#include #include using namespace std;原创 2016-03-06 00:57:43 · 699 阅读 · 0 评论 -
nyoj ones
想的时候还是要很久。。。dp[i]=min(dp[i-1]+1,dp[k]+dp[i/k]);(2#include #include #include using namespace std;#define N 10001int dp[N];int n;int main(){ for(int i=1;i<6;i++) dp[i]=i; for原创 2016-03-06 01:15:56 · 367 阅读 · 0 评论 -
nyoj 首尾相连数组的最大子数组和
这道题如果按照O(n*n)的复杂度写会TLE。。。所以需要转化思想,其中有两种方法,可是我一种都没想到。法一:构造虚假数列,即复制一遍数组放置于原数组后面,这样就可以看成求首尾不连接的最大和,但是有限制条件。第一,最大子和的首位位置在1~n中,不能超出n。第二,最大和的长度不能超过n。按照求最大和的方法再加上两个限制条件,但是写起来有点nan~~(对我来说)#include #i原创 2016-03-07 20:02:43 · 584 阅读 · 0 评论 -
nyoj 飞翔d
想不到可以转化为最长递增子序列。。。因为每走一步都是往上走,所以求出一段最长的斜路即使最短路径。#include #include #include #include using namespace std;#define N 1000005#define inf -999999struct node{ int x,y;} s[N];int dp[N],n,m;原创 2016-03-07 21:24:04 · 345 阅读 · 0 评论 -
nyoj 又见01背包
由于题目中W的数据太大,一维数组存放不了,所以需要逆向思维。。。dp[i]表示价值为i时的最小重量,需要注意的问题1.初始化为无穷大的值,maxn=0x3f3f3f3f2,dp[0]为0,否则数不出结果,这点很重要,刚开始没主要到。3.dp[i]=min{dp[i],dp[i-v[j]]+w[i]}总感觉自己就像一个没有思维的人,遇到一点问题就头皮发麻,脑袋混乱,好原创 2016-03-10 22:42:53 · 314 阅读 · 0 评论 -
cf C. Fragile Bridges
这道题看了题解,认识了多方向的dp,但是我明白的还是太少了,至于在求最大值的时候算的是o(n*n),TLE了,虽然方法正确,但是还是没有真正的了解思路。。。。dr[i]表示的是从i点出发向右走再回到i点时的最大路程,同理dl[i]sumr[i]表示的是从i点出发i~n点间的最大路程,同理suml[i],(开始时设错了,以为是从0出发到i点的最大路程,这样的话在后面求最大值的时候就要sum[原创 2016-03-12 01:08:26 · 547 阅读 · 0 评论 -
hdu 4501 小明系列故事――买年货
一个很显然的背包问题,可是想不到开三维的,对于三位以上我就一脸的懵逼~~状态转移:dp[i][j][k]=max{dp[i]-s[t]][j][k]+val[t],dp[i][j-y[t][k]+val[t],dp[i][j][k-1]+val[t],dp[i][j][k]}就是花费钱或者花费积分或者花费免费次数,因为价格可能为0,在求dp的时候不能直接用dp[i][j][k]去和三者原创 2016-03-14 21:03:48 · 662 阅读 · 0 评论 -
LIS O(nlgn)最简写法
挑战上一个LIS的写法真的好短,,,利用了STL的fill,lower_bound1.这里注意fill,memset的区别memset是按字节填充的,初始化的时候只能初始化为0,-1,不能为1或其他例如当memset int 初始化为1时,则为(1fill是把某一区域赋值2.lower_bound:找出第一个a[i] upper_bound:找出原创 2016-03-16 13:25:20 · 1085 阅读 · 1 评论 -
挑战 多重部分和问题
挑战程序设计P62 多重部分和问题题意:有n种不同大小的数字,每种数字各mi个。判断是否可以冲这些数字中选出若干个使他们的和加起来等于K、有两种dp方法,但是时间复杂度不一样第一种:定义dp[i][j]:是否前i种数字能相加等于j,则dp[i][j]=dp[i][j]|dp[i-1][j-t*a[i]] (0但是这种定义的复杂度为O(n*K*m),太大了所以原创 2016-03-16 13:01:42 · 427 阅读 · 0 评论 -
滑雪(百练1088) (dp+dfs)
解题思路 L(i,j)表示从点(i,j)出发的最长滑行长度。 一个点(i,j), 如果周围没有比它低的点,L(i,j) = 1 否则 递推公式: L(i,j) 等于(i,j)周围四个点中,比(i,j)低,且L值最大的那个点 的L值,再加1 转移方程很容易想到,但是我没想到的是需要结合dfs,我又不会dfs(什么都不会),所以一道很简单的水题都做不出来,看题解原创 2016-02-05 17:34:10 · 766 阅读 · 0 评论 -
校OJ 17089 最大m子段和
基础不行,唉,看懂一道题要花费几天的时间~~法一: 递推公式: dp[i][j]=max{dp[i][j-1]+a[j],max{dp[i-1][t]+a[j]}} (i-1 b[i][j]表示的是第i段在前j项(含第j项)的最大值。对于b[i][j]含有第j项必须要理解好!则方程的意思是:对于a[j]项,要么将它加到第i段,要么它自己作为新的一段。注原创 2015-12-30 10:25:46 · 1204 阅读 · 0 评论 -
11078 不能移动的石子合并(dp)
题目要求:(1)第一个模型:一行排列且相邻合并有n堆石子A1,A2,...,An形成一行,每堆石头个数记为ai(1<=i<=n),相邻两堆可合并,合并的分值为新堆的石子数。求合并为一堆的最低得分和最高得分。(2)第二个模型:一圈排列且相邻合并有n堆石子A1,A2,...,An形成首位相连的一个环形,An和A1相邻,每堆石头个数记为ai(1<=i<=n),相邻两堆可合并,原创 2016-01-03 08:59:33 · 1379 阅读 · 0 评论 -
njoj1023 还是回文(区间dp)
刚开始不理解状态方程,后来问群上明神说一句数学归纳法的道理,觉得对dp又了解了一点。。。。状态方程: dp[i][j]==min(dp[i+1][j]+a[i],dp[i][j-1]+a[j]), 当str[i]==str[j]:dp[i][j]=min(dp[i][j],dp[i+1][j-1])其中dp[i][j]表示从i~j的最小花费,原创 2016-01-22 22:31:13 · 605 阅读 · 0 评论 -
nyoj246 Human Gene Functions(LCS变形)
花了两个多小时才把这道水题A了,不过1A还是值得开心的这道题就是LCS的变形,不过验证转移方程花了好久,还是多得练习,特别是代码,其实很多时候有想法但是不知怎么用代码实现。。。转移方程:dp(i,j)=max(dp(i-1,j)+s[i], dp(i,j-1)+s[j], dp(i-1,j-1)+s(i,j) )其中dp(i,j)表示s1的前i个和s2的前j个匹配原创 2016-01-23 15:26:50 · 405 阅读 · 0 评论 -
nyoj456 邮票分你一半(01背包)
很显然的01背包问题,但是想的方向不对,半天都写不出转移方程,发现越做题越显得自己脑残~~~这题的重点把两堆邮票看成两个容器,而我一直做成两堆弄得很烦,其实就是把n个物品放到sum/2里的最大值,开始没想到,想一下才觉得这个方案是成立的,因为当一堆装得越多,另一堆也会越接近总数的一般,这样就可以经典的01背包问题了,但是我做了二维的超空间了,要做成一维的,久没看背包也忘了一维怎么写了,原创 2016-01-23 20:47:59 · 507 阅读 · 0 评论 -
nyoj571 整数划分(三)
这道题吃了翔,尼玛有没说多case。。。通过这道题,初步了解了整数划分的经典问题,值得。一 求将n划分为若干正整数之和的划分数 1. 若划分的多个整数可以相同 设dp[i][j]为将i划分为不大于j的划分数 (1) 当i时,i不能划分为大于i的数,所以dp[i][j]=dp[i][i]; (2) 当i>j 时,可以根据划分中是否转载 2016-01-24 19:46:19 · 1080 阅读 · 0 评论 -
nyoj61 传纸条(一) (双线dp)
初次学双进程dp,其实就是多维dp,但是就是多一维我的脑子就转不过来了,模模糊糊看得懂而已,从矩阵的左上角(1,1)点到矩阵的右下角(m,n)点找到两条不相交的路径使其值最大,题中是从(1,1)到(m,n)走一次,再从(m,n)到(1,1)走一次,我们可以等价变形一下,变为:同时从(1,1)走向(m,n)找两条路,且这两条路不相交,同时走!假设有两个人在走,一个原创 2016-01-25 00:31:26 · 707 阅读 · 0 评论 -
校OJ 最大m段乘积和最小m段和
描述:给一个n位的数和m,代表将n位数分成m段,求最大m段乘积和最小m段和,同样也可以求m段的最小积和最大和,原理一样刚开始的时候并没有做得出来,因为dp的状态转移方程写错了,还是太嫩了,没有理解好思路,弄了半天原来其实状态方程很好理解,但是用到了n^3,所以没太敢去想太大的复杂度。。。设dp(i,j)=max(dp(i-1,k)+sum[k+1,j]),其中i表示第i段,j表示已原创 2016-01-09 01:19:09 · 901 阅读 · 0 评论 -
最长上升子序列nlog(n)
nlog(n)的方法从很久之前就看了,愣是没看懂,因为这个条件现在,我们仔细考虑计算F[t]时的情况。假设有两个元素A[x]和A[y],满足 (F[]保存LIS长度)(1)x (2)A[x] (3)F[x] = F[y] 没看懂,当A[x]其实这只是传递一个思想而已,当两者的LIS都一样时取最小值效果更好。只要明白这一点就行了。再根据那个思想,我们会得到一个启示原创 2015-12-30 12:09:36 · 674 阅读 · 0 评论 -
北大培训课动态规划----神奇的口袋(百练2755)
北京大学暑期课《ACM/ICPC竞赛训练》 ppt摘取什么是动态规划?●递归到动规的一般转化方法 递归函数有n个参数,就定义一个n维的数组,数组 的下标是递归函数参数的取值范围,数组元素的值 是递归函数的返回值,这样就可以从边界值开始, 逐步填充数组,相当于计算递归函数值的逆过程。●动规解题的一般思路 1. 将原问题分解为子问题 把原问题分解为若干个子问原创 2016-02-05 15:41:06 · 2975 阅读 · 1 评论 -
多重背包代码
#include #include #include using namespace std;const int maxn=10000+10;int dp[maxn],p[maxn],h[maxn],c[maxn];int t,n,m;void ZeroOnePack(int cost,int weight,int exceed){ for(int i=exceed;i>=c原创 2016-04-10 14:28:29 · 504 阅读 · 0 评论