上一页 1 2 3 4 5 6 7 8 9 10 ··· 13 下一页
摘要: 有两种做法 第一种定义cnt[j]为体积恰好为j的所有方案数 第二种定义cnt[j]为体积不超过j的所有方案数 定义不同,初始状态(边界)不同,计算答案的方式也不同 #恰好的写法 //不超过的写法 #include<bits/stdc++.h> using namespace std; #defin 阅读全文
posted @ 2022-06-28 16:56 xhy666 阅读(30) 评论(0) 推荐(0)
摘要: 树形dp + 分组背包 #include<bits/stdc++.h> using namespace std; #define fr first #define se second typedef pair<int, int> PII; typedef long long LL; typedef 阅读全文
posted @ 2022-06-28 15:56 xhy666 阅读(26) 评论(0) 推荐(0)
摘要: 分组背包 输出方案可以跟最短路输出路径进行类比 #背包DP输出方案—拓扑图分析 #include<bits/stdc++.h> using namespace std; #define fr first #define se second typedef pair<int, int> PII; ty 阅读全文
posted @ 2022-06-27 23:23 xhy666 阅读(22) 评论(0) 推荐(0)
摘要: 二进制优化转化成01背包的复杂度为 O(n logm * m) (m为背包容量),大概是2 * 1e8的数量级,一般会超时 发现如果以j(0 <= j <= m)模上v的余数分类,相当于求固定区间的最大值(滑动窗口),可以用单调队列优化,复杂度为 O(n * m) #include<bits/std 阅读全文
posted @ 2022-06-27 16:56 xhy666 阅读(36) 评论(0) 推荐(0)
摘要: 直觉上B集合是A集合的非空子集,也就是说可以从A中舍弃一些元素,这些元素能被其他元素表示 就转化成了多重背包问题 #include<bits/stdc++.h> using namespace std; #define fr first #define se second typedef pair< 阅读全文
posted @ 2022-06-26 17:12 xhy666 阅读(13) 评论(0) 推荐(0)
摘要: 注释1是把三重循环优化成二重(maxlen只跟a[i]和前b的前j-1个前缀有关,而j是从小到大枚举的,可以在枚举的过程中处理) 注释2是把二维数组优化为一维(观察可知f[i][j]可以被f[j]覆盖掉而不影响结果) 优化完成后的代码就非常反直觉了(在我看来),所以以后dp题最好先自己把朴素的思路想 阅读全文
posted @ 2022-06-25 17:46 xhy666 阅读(30) 评论(0) 推荐(0)
摘要: 补题 阅读全文
posted @ 2022-06-25 01:38 xhy666 阅读(30) 评论(0) 推荐(0)
摘要: 跟方格取数那题类似,唯一的区别是不能经过同一点 但是由于题面保证了每个格子的贡献都是正数,所以只要保证当前两点不同即可,因为从同一点转移过来的会被从不同点转移过来给优化掉 #include<bits/stdc++.h> using namespace std; #define int long lo 阅读全文
posted @ 2022-06-24 16:44 xhy666 阅读(33) 评论(0) 推荐(0)
摘要: 题意等价于:选择两条从A到B的路径,路径上的点对答案至多贡献一次,求最大值 很容易想到先计算第一条路径,再计算第二条路径(f[i1][j1][i2][j2]),判断重合的点,但这样没有利用重合点的必要性,有时间和空间上的冗余 进一步想到,每对重合点的横纵坐标之和必定相等 也就是说只有当i1 + j1 阅读全文
posted @ 2022-06-24 01:36 xhy666 阅读(27) 评论(0) 推荐(0)
摘要: 记得补题 阅读全文
posted @ 2022-06-22 23:11 xhy666 阅读(16) 评论(0) 推荐(0)
上一页 1 2 3 4 5 6 7 8 9 10 ··· 13 下一页