dp
文章平均质量分 52
ACkingdom
这个人很懒,什么都没有留下
展开
-
洛谷-P1040 [NOIP2003 提高组] 加分二叉树(区间DP,二叉树,先序遍历)
题目链接 题意: 已知一个二叉树的中序遍历的结果是一个递增的排列,给你这些节点的权值,根节点的值等于两个子节点的乘积加上他本身的权值,如果子节点为空则视为1,求这个二叉树能达到的最大值以及在该结果下的先序遍历序列。 思路: 首先,我们需要知道,中序遍历的情况下,每一个节点的两边都会是它的子节点或者子节点的子节点等等,所以我们只需要用一个区间dp来维护每一个小的二叉树的最大值即可,状态转移方程为: dp[j][j+i-1] = dp[j][k-1]*dp[k+1][j+i-1]+dp[k][k]; 这里注意,原创 2021-04-21 00:17:46 · 230 阅读 · 0 评论 -
洛谷 P1048 采药(DP)
题目链接 思路: 基础01背包DP。 代码: #include<bits/stdc++.h> #define int long long #define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); const int N=6e6+10; const int M=2e4+5; const double eps=1e-8; const int mod=998244353; const int inf=0x7fffffff; cons原创 2020-08-04 21:37:43 · 258 阅读 · 0 评论 -
洛谷 P1216 [USACO1.5][IOI1994]数字三角形 Number Triangles
题目链接 思路: 从上往下跑,用原数组直接dp记录到达该位置的最大值。 代码: #include<bits/stdc++.h> #define int long long #define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); const int N=1010; const int M=2e4+5; const double eps=1e-8; const int mod=1e9+7; const int inf=0x7ff原创 2020-08-04 01:00:33 · 151 阅读 · 0 评论 -
洛谷 P1802 5倍经验日(DP)
题目链接 思路: 当i>=use时,可以选择打败或者不打败,dp[i]=max(dp[i]+lose,dp[i-use]+win)。当i<use时,无法战胜对方。dp[i]+=lose。 代码: #include<bits/stdc++.h> #define int long long #define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); const int N=2e5+5; const int M=2e4+5原创 2020-08-04 00:54:32 · 169 阅读 · 0 评论 -
Codeforces Round #659 (Div. 2) B1. Koa and the Beach(DP)
题目链接 思路: DP记录每秒的海域状态,看你能否到达对面。 代码: #include<bits/stdc++.h> using namespace std; #define int long long #define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); const int N=1e2+5,M=2e4+5; const double eps=1e-8; const int mod=1e9+7; const int inf原创 2020-07-28 22:07:20 · 161 阅读 · 0 评论 -
Codeforces Round #658 (Div. 2) D. Unmerge(dp,01背包)
题目链接 思路: 将每个数和他之后的比他小的数都分为一组,对分好的组进行01背包,看能否将组的总和变为n。 代码: #include<bits/stdc++.h> using namespace std; #define int long long #define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); const int N=1e5+7; const double eps=1e-8; const int mod=1e9+7原创 2020-07-22 22:29:46 · 126 阅读 · 0 评论 -
Codeforces D. Omkar and Circle(思维,dp)
题意: n个数字组成一个环,每次选择一个数字将其相邻的两个值赋给他,然后删除相邻的值,这样操作只剩一个值,求这个值的最大值。 思路: 利用三个循环来维护前缀和,分别利用b和c数组求得(不相邻的)前缀和及(不相邻的)后缀和。 代码: #include <bits/stdc++.h> using namespace std; #define int long long #define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); ty原创 2020-07-14 21:36:03 · 194 阅读 · 0 评论 -
Codeforces Round #652 (Div. 2)-D. TediousLee(dp,思维)
题目链接 题意: 阅读理解,建议去这篇博客自己看,(感谢带佬博主%%%%)。—>翻译博客 思路: 根节点不取的情况下,取子节点为爪 dp[i]=dp[i−1]+2∗dp[i−2]dp[i]=dp[i-1]+2dp[i-2]dp[i]=dp[i−1]+2∗dp[i−2] 当子节点不能为爪的情况下,取根结点,此时 i整除3. dp[i]=dp[i−1]+2∗dp[i−2]+4dp[i]=dp[i-1]+2dp[i-2]+4dp[i]=dp[i−1]+2∗dp[i−2]+4 代码: #include<原创 2020-07-11 22:52:46 · 190 阅读 · 0 评论 -
SCPC-普普通通的DP(字面意思)
题目链接 题意: 给你一个n*m的矩阵,你需要从左上角走到右下角,你每次只能向下或者向右走,并且不能走出矩阵之外。只要你走到终点之后,你就会获得奖励,奖励的金额为:所有经过的元素做“与”运算。算一算你能获得的最大奖励金额为多少。 思路: 位置越高对答案影响越大,所以我们从高位到低位开始跑,计算每一位是否能有数字跑到最后且不影响之前的位置,具体实现看代码注释。 代码: #include<bits/stdc++.h> using namespace std; #define int long lon原创 2020-06-17 20:24:44 · 274 阅读 · 0 评论 -
洛谷-AT2827最长上升子序列(dp)
题目链接 题意: 给定一长度为n的数列,请在不改变原数列顺序的前提下,从中随机的取出一定数量的整数,并使这些整数构成单调上升序列。 输出这类单调上升序列的最大长度。 数据范围: 1<=n<=1000001<=n<=100000 思路: dp 代码: 正常求LIS的方法应该下面这种: #include<bits/stdc++.h> using namespace std; #define int long long #define IOS ios::sync_with_st原创 2020-05-30 20:48:32 · 413 阅读 · 0 评论 -
Gym-102152-K. Subarrays OR(dp,异或,思维)
题目链接 题意: 给你一个数组,求这个数组的所有字段“|”的不同的值有多少个。 思路: set去重,数据1e5,暴力跑n方肯定会t,所以我们过程中开一个set(应该算是dp)来记录之前“|”过的区间的值。 代码: #include <bits/stdc++.h> using namespace std; const int inf=0x3f3f3f3f; const int N=2e5+7; #define IOS ios::sync_with_stdio(false);cin.tie(0);c原创 2020-05-09 01:56:23 · 205 阅读 · 0 评论