随笔分类 -  Re0:DP

摘要:解法 区间dp例题,长度从2开始到n结束起点从1到n,中间枚举的时候是看着左端点右端点与中点的乘积 代码 include include using namespace std; int dp[666][666],num[666]; int main() { ios::sync_with_stdio 阅读全文
posted @ 2019-01-27 13:09 baccano! 阅读(166) 评论(0) 推荐(0)
摘要:解法 区间dp例题,每次枚举分段点的时候先更新如果开始到结束区间端点有闭合的括号,那么dp[start][end]=dp[start+1][end 1]+2其他照常枚举即可 代码 include include using namespace std; int dp[666][666]; int m 阅读全文
posted @ 2019-01-26 21:45 baccano! 阅读(227) 评论(0) 推荐(0)
摘要:题目 描述 有N堆石子排成一排,每堆石子有一定的数量。现要将N堆石子并成为一堆。合并的过程只能每次将相邻的两堆石子堆成一堆,每次合并花费的代价为这两堆石子的和,经过N 1次合并后成为一堆。求出总的代价最小值。 输入 有多组测试数据,输入到文件结束。 每组测试数据第一行有一个整数n,表示有n堆石子。 阅读全文
posted @ 2019-01-24 16:39 baccano! 阅读(388) 评论(0) 推荐(0)
摘要:解法 二维dp还是要找一种递推的关系 这里用正方形的右下角来一起递推,也就是说如果当前值是1的话,那么就去寻找左边上面和左上的最小dp值+1,最后输出最大的dp值即可 代码 include using namespace std; int num[666][666],dp[666][666]; in 阅读全文
posted @ 2019-01-20 13:36 baccano! 阅读(162) 评论(0) 推荐(0)
摘要:解法 lis和 之前dp代表的是当前lis的最大的长度,现在求的是lis的和,那么引入一个新的ans来记录和 注意遍历的时候i从1开始,j从0开始这也可以遍历第一个数 代码 include using namespace std; int a[1005],ans[1005]; int main() 阅读全文
posted @ 2019-01-13 19:38 baccano! 阅读(205) 评论(0) 推荐(0)
摘要:解法 完全背包但是又有别的条件(忍耐值为体力经验是价值) ①首先杀怪是有上限s的,所以需要记录杀怪的数量并且if时候还需要加上条件 ②最后还得遍历一下从小到大遍历当前dp范围内是不是已经有够经验的那么就可以直接输出忍耐值的差 ③最后如果没有经验达到的话那么输出 1 ④一定得注意dp更新的时候的条件 阅读全文
posted @ 2019-01-10 17:50 baccano! 阅读(213) 评论(0) 推荐(0)
摘要:解法 分组背包模板题 分组背包模板 i n j m cin w[i][j] i n j:m 0 k:1 j dp=max(dp,dp[ ]+w[i][k]) 代码 include using namespace std; int dp[1000],w[1000][1000]; int main() 阅读全文
posted @ 2019-01-09 17:00 baccano! 阅读(112) 评论(0) 推荐(0)
摘要:解法 二维费用01背包问题 解法就是先枚举物品再枚举条件这里两个条件所以要枚举两个for 代码 include using namespace std; int dp[500][500],v[100],m[100],w[100]; int main() { ios::sync_with_stdio( 阅读全文
posted @ 2019-01-09 16:14 baccano! 阅读(144) 评论(0) 推荐(0)
摘要:解法 多重背包板子题 多重背包板子 如果上限的体积大于了给定的体积那么套完全背包 否则二进制优化成01背包 代码 include include using namespace std; int dp[100005],m; void zb(int v,int w) { for(int i=m;i = 阅读全文
posted @ 2019-01-09 15:29 baccano! 阅读(136) 评论(0) 推荐(0)
摘要:解法 完全装满背包 求最小值那么把所有的dp设置成inf(要完全装满),且转移方程写min,原点设置为0,然后套完全背包就可以了 能不能完全装满的检测就是看dp[m]有没有更新,更新了那么就是能完全装满否则完全装不满 代码 include using namespace std; int dp[10 阅读全文
posted @ 2019-01-08 21:56 baccano! 阅读(149) 评论(0) 推荐(0)
摘要:解法 完全背包+大数。。。不想写大数了放个python得了 代码 阅读全文
posted @ 2019-01-08 20:10 baccano! 阅读(94) 评论(0) 推荐(0)
摘要:解法 dp表示目前的种数,要全部装满所以f[0]=1其余为0的初始化是必不可少的 代码 阅读全文
posted @ 2019-01-08 19:19 baccano! 阅读(148) 评论(0) 推荐(0)
摘要:解法 排序+01背包 这里的排序规则用q p升序排列这里是一个感觉是一个贪心的策略,为什么这样做目前也无法有效的证明或者说出来 然后就是01背包加了一个体积必须大于什么值可以装那么加一个max(p,q)的条件即可 代码 include using namespace std; struct node 阅读全文
posted @ 2019-01-07 11:29 baccano! 阅读(149) 评论(0) 推荐(0)
摘要:伪代码 用二维数组记录,如果出现可以转移的dp那么记录bk[当前体积][装的物品]=1 输出的时候倒推,如果存在连通的边那么输出并且总共的体积减去输出的体积 代码(uva 624,目前wa不明所以,网上的答案也是那么输出的,或许要输出最多的物品?目前也不会这种玩法) include using na 阅读全文
posted @ 2019-01-06 10:55 baccano! 阅读(380) 评论(0) 推荐(0)
摘要:解法 01背包变式,首先贪心的想一下如果要保证余额最小那么就需要用相减后最小的钱减去之前最大的价格,且得保证这个钱在5元以上 对于寻找如何减最多能包含在5元以上,这里用01背包 我们把价钱看做体积装进一个余额 5的01背包内,为什么是余额 5? 因为我们要保证总的价格在5元以上,还得保证不装最后一个 阅读全文
posted @ 2019-01-06 09:48 baccano! 阅读(147) 评论(0) 推荐(0)
摘要:解法 一定要注意斐波那契数列的原始意义,斐波那契数列也叫作兔子数列是兔子繁衍的一种表示方法。同样适用于别的情况的动物繁衍问题 原始的是3个月一胎现在四个月那么方程就是 f(n)=n n4 代码 include using namespace std; int dp[1000][1000],num[1 阅读全文
posted @ 2019-01-05 10:58 baccano! 阅读(151) 评论(0) 推荐(0)
摘要:解法 首先是输入的问题,输入的时候还要注意每一层都有多少个 然后是怎么求解,一般求解首先要考虑顺序,是正序还是倒序 如果这个题是正序的话那么最终还需要将最后一行进行一次找max的运算 如果是倒序的话那么最终归于同一个起点,直接进行输出即可 转移方程 转移方程考虑把问题分散化,分散成小的问题,其中这个 阅读全文
posted @ 2019-01-05 10:07 baccano! 阅读(227) 评论(0) 推荐(0)