dp
UFO_Wlc
这个作者很懒,什么都没留下…
展开
-
【动态规划——盗版无限背包(有个数限制)】coin——金币
题目讲解: 用一个数组f[i]表示i的价格是否能达到 f[0]=1,表示价格为0可以到达,赋初值 后用s[i][j]表示到达i的价格用的第j个钱几个 用无限背包的方法加一句判断s[i][j]<j所能用的最大个数 (无限背包不会的话看程序后的讲解) #include<cstdio> #include<cstring> int n,m; int a[...原创 2018-04-22 15:24:45 · 523 阅读 · 1 评论 -
【动态规划——基础】01背包与无限背包
无限背包讲解: 一个物品可以放很多次 所以先前更新的状态要求影响后面更新的状态 01背包要求是从最大值向后扫以保证每个物品只用一次 所以每个物品可以用多次,从前往后扫即可 例子(f[i]表示与上程序中一样): 假设物品质量4 容量10 01:从10往前扫,扫到f[0]=1,然后更新f[0+4]=1 无限:从0往后扫,首先扫到f[0]=1,更新f[0+4]=1 再往后扫,再次扫到...原创 2018-04-22 15:43:40 · 1338 阅读 · 0 评论 -
【动态规划——单调队列维护】——烽火传递
用q[i]表示到i前面符合条件的最小代价为多少(要取到i) 单调队列维护区间中q[i]的最小值 l,r表示单调队列的队首与队尾 从1到n循环,若q[qj[r]]>q[i](队尾比当前大) 弹出队尾将当前放入 若qj[l]<i-m(长度大于要求)l++ 最后更新一下q[i]=q[l]+a[i](符合要求区间中最小值加当前值为当前最小值) 答案在n—n-m+1中 #inc...原创 2018-04-23 10:09:23 · 464 阅读 · 0 评论 -
【动态规划——状态压缩】dream——蒙德里安的梦
用二进制状态压缩,用f[i][s]表示做到第i行状态为s。 s的二进制表示第几位(第几个位置)是否被放过——状态s=10(1010)第一个位置被放过,第二个位置没被放过,第三个位置被放过,第四个位置没被放过。 然后分层枚举本层状态与上层状态,若两种状态相符合,f[i][s]+=f[i-1][ss](ss为上层状态,s为本层状态)。 判断状态符合方法: 1、s中j位为0,ss中j位为1(在i...原创 2018-04-19 20:42:09 · 270 阅读 · 0 评论