动态规划
Lupin123123
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
[蓝桥杯复习] 生命之树
题目链接 树形dp基础题 f[x][0]f[x][0]f[x][0]:考虑以xxx为根节点的子树时,不选xxx的最大权值 f[x][1]f[x][1]f[x][1]:考虑以xxx为根节点的子树时,选xxx的最大权值 #include<bits/stdc++.h> #define FAST ios::sync_with_stdio(false),cin.tie(0),cout.tie(0) #define INF 0x3f3f3f3f typedef long long ll; const int原创 2022-04-04 22:56:14 · 504 阅读 · 0 评论 -
[蓝桥杯复习] 鸣人的影分身
题目链接 问题的本质就是求将nnn拆成mmm份的方案数,和求nnn个苹果放在mmm个盘子的方案数是一个问题。 方法一:暴力dfs #include<bits/stdc++.h> #define FAST ios::sync_with_stdio(false),cin.tie(0),cout.tie(0) #define INF 0x3f3f3f3f typedef long long ll; const int maxn = 1e5+5; using namespace std; int m原创 2022-04-04 21:27:18 · 783 阅读 · 0 评论 -
Up the Strip
题目链接 dp+刷表 考虑用除的方法到达if[i]f[i]f[i] 对 [i×j, i×j+i−1][i\times j,\ i\times j+i-1][i×j, i×j+i−1] 都有贡献,所以可以枚举倍数,像埃氏筛一样刷。区间修改用树状数组会T,注意到查询位置单增,修改的位置均在最近的查询位置之后,所以用差分维护。总复杂度O(nlogn)O(nlogn)O(nlogn) 完整代码: #include<bits/stdc++.h> #define FAST ios::sy原创 2021-08-26 22:34:51 · 183 阅读 · 0 评论 -
[hdu] P7079 Pty loves lines
题目链接 经典的求直接交点数的问题 之前做过简化版 ,并且安利一下自己的题解 如果依旧像之前一样用二维dp[i][j]表示能否达到i条直线,j个交点的情况,将面临运行超时,dp数组存不下的尴尬局面。那么考虑新的做法。 考虑讲n条直线划分为若干组,每一组内的直线两两平行且这个组是极大的。设总共分成了 ppp 组,每一组的直线数为 aia_iai,那么交点数就是n(n−1)2−∑i=1kai(ai−1)2\frac{n(n-1)}{2}- \sum_{i=1}^k\frac{a_i(a_i-1)}{2}2n(原创 2021-08-20 01:23:41 · 646 阅读 · 6 评论 -
[Luogu] P1108 低价购买
题意:求一个序列中最长下降子序列的方案数,看上去一样的方案只算一次。 设f[i]表示1…i中以a[i]结尾的最大下降子序列的方案数,dp[i]表示以a[i]结尾的最大下降子序列的长度。如果是不要求把看上去一样的方案去掉,可以按如下的代码计数: for (int i=1; i<=n; i++) { if (dp[i]==1) f[i]=1; for (int j=1; j<=i-1; j++) if (a[i]<a[j] && dp[i]==dp[原创 2021-08-08 17:35:20 · 112 阅读 · 0 评论 -
[Luogu] P1122 最大子树和
直接d[x]+=max(0,dp[son]),但是答案不一定是dp[root],因为根节点不一定会被选上,要中途记录最大值。 #include<bits/stdc++.h> #define FAST ios::sync_with_stdio(false),cin.tie(0),cout.tie(0) #define INF 0x3f3f3f3f typedef long long ll; const int maxn = 2e5+5; using namespace std; int n,r原创 2021-08-05 00:38:56 · 149 阅读 · 0 评论 -
[Luogu] P2014[CTSC1997] 选课
思路:(跟[Luogu] P2015 二叉苹果树几乎一模一样) 1.建一棵有根树,因为每门课有一门或没有直接先修课,所以父亲是先修课 2.树上dp,转移方程dp[x][j]=max{dp[x][k]+dp[son][j-k]} dp[x][j]表示在以x为跟的树上选j个点所能获得的最大值 tips:由于父节点是先修课,所以在以x为跟的树上选j个结点,j>1时根节点必须选择,即dp[x][j]不能从dp[x][0]+dp[son][j]转移过来 具体体现为下面的代码片段 #include<bits原创 2021-08-04 23:53:19 · 189 阅读 · 0 评论 -
[Luogu] P1040[NOIP2003 提高组] 加分二叉树
思路:因为中序遍历已知,所以找到根以后就可以递归的处理问题了。 定义dp[i][j]表示中序遍历i到j的子树的最大加分,那么dp[i][j]=max{dp(l,k-1)*dp(k+1,r)+dp[k][k]},然后可以记忆化搜索。 #include<bits/stdc++.h> #define FAST ios::sync_with_stdio(false),cin.tie(0),cout.tie(0) #define INF 0x3f3f3f3f typedef long long ll; c原创 2021-08-04 22:51:31 · 153 阅读 · 0 评论 -
[Luogu] P2015 二叉苹果树
#include<bits/stdc++.h> #define FAST ios::sync_with_stdio(false),cin.tie(0),cout.tie(0) #define INF 0x3f3f3f3f typedef long long ll; const int maxn = 1e5+5; using namespace std; int n,q; int dp[1001][1001],w[maxn],size[maxn]; int cnt,head[maxn]; st原创 2021-08-04 18:44:02 · 157 阅读 · 0 评论
分享