合集-动态规划dp
摘要:原题链接 太妙了,请移步题解区,有用数学归纳法做的,也有用找规律做的 L型积木一定是成对出现的 code #include<bits/stdc++.h> using namespace std; const int mod=1e9+7; long long dp[10000005]={0}; int
阅读全文
摘要:原题链接 题解 细节很多的树形dp,请看代码 code #define ll long long #include<bits/stdc++.h> using namespace std; ll sit[100005]={0}; ll f[100005]={0}; vector<ll> G[10000
阅读全文
摘要:原题链接 题解 一开始我想的是每个节点要么建,要么不建,可是这样一来不好转移,因为有如下情况(黑色代表建站) 于是我们换一个角度思考,我们发现一个点要能通网,有三种情况: 1.自己建站 2.儿子建站 3.父亲建站 Code #define ll long long #include<bits/std
阅读全文
摘要:原题链接 题解 巧妙的背包问题 我可以用按顺序遍历城堡,顺便表示出遍历到当前城堡时用掉了多少兵力,这样是可以穷尽所有兵力派送情况的 同时把这个城堡里的敌方兵力升序排序,然后遍历,表示为了消灭所有兵力小于等于ta的敌人所加的分 code #include<bits/stdc++.h> using na
阅读全文
摘要:原题链接 题解 太妙了 如果能出去,那么出去的时间一定为让我出去的那个垃圾掉落的时间,且在此之前我所在的高度能撑到我垃圾掉落 如果出不去,我肯定一直呆在井底不动 所以我们可以以高度为变量 设每个高度能撑到的最久的时间 而每个垃圾在拿到的一瞬间要么吃要么搭,所以我们穷举,两个都要,如果搭,那么搭上去的
阅读全文
摘要:原题链接 题解 遍历主件,和还剩下多少钱的情况下,最多有五种购买决策 1.不买 2.买主件 3.买主件+附件1 4.买主件+附件2 5.买主件+附件1+附件2 如果当前的钱够买,那就买买看,然后加上剩下的钱能买的最大值 code #include<bits/stdc++.h> using names
阅读全文
摘要:原题链接 题解 我们发现,当前的决策会影响未来的结果,因此我们把当前的决策存下来,这样等未来要用的时候就有的转移了,如果未来由多个状态决定,那就现在把那些状态都记录下来 我们发现,一个点如果能被吸收,那么其左边或右边的一个区间的点都肯定被吸收了,所以我们记录 表示区间 \([
阅读全文
摘要:原题链接 题解 等价于线性代数中求最大无关组的大小 code #include<bits/stdc++.h> using namespace std; int main() { int t; cin>>t; while(t--) { int n; cin>>n; int a[105]={0}; fo
阅读全文
摘要:原题链接 题解 对于每个容量,当前组 而言,放的决策有 种 code #include<bits/stdc++.h> using namespace std; struct unit { int w,v; }; vector<unit> G[1005]; in
阅读全文
摘要:原题链接 题解 代码量小的离谱,思维难度大的离谱 对于两个原本不相邻的同色区域块,历经千辛万苦碰面的场景,我们可以描述成右边的区域块为左边的区域块消除的时候增添了长度 设 代表消除区域 同时该区域的 增添了长度 但是
阅读全文
摘要:原题链接 题解 话说dalao们是怎么做这么快的?? 问从含有字符串的背包中取出一些字符串(每个背包只能娶一个),问能拼凑出给定字符串的最小代价 由于这里的拼凑是有顺序的,即如果b能拼上的是中间一块,那么a一定拼的是前边一块,这种拼凑让人想到了背包 这里是字符串的背包,其实是一样的,先判断能不能放进
阅读全文
摘要:原题链接 题解 当你直到贪心不可行的时候就要用dp了 code #include<bits/stdc++.h> using namespace std; int ans=2e9; vector<int> G[10005]; int dp[100005][55]={0}; void ss(int no
阅读全文
摘要:原题链接 题解 1.选择一个区间,然后加上其和的 倍,所以我们要选中区间和最大的那个 2.然而由于倍数可能为负,即 ,所以这时我们要尽可能选和小的 3.由于最多选一次,意味着也可以不选,所以dp的时候不选就可以赋零 code #include<bits/stdc++
阅读全文
摘要:原题链接 审题 1.连续子序列:子序列必须连续 2.最小长度为1 3.子序列之间至少隔一个数 题解 令 代表i及其之前的最大前缀和 则第一步更新令 为必须包括i的最大前缀和,第二步更新令其为i及其之前的最大前缀和。 sufsum同理 最后枚举断
阅读全文
摘要:原题链接 题解 这里和线性最大两段子段和不同,没有子段之间必须间隔一米,所以处理方式略有不同 code #define ll long long #include<bits/stdc++.h> using namespace std; ll a[200005]={0},pre[200005]={0}
阅读全文
摘要:原题链接 题解 1.我们没法遍历每个区间然后找出他们的最小值,所以我们考虑每个元素对答案的贡献 2.对于每一个元素来说,它的贡献等于它所在的区间长度乘上自身的值,这里的区间指的是以它为最小值的区间 3.以每个元素为最小值的区间要怎么求呢?我们将其转换成求左边第一个小和右边第一个小 对于这种问题(求序
阅读全文
摘要:原题链接 题解 1.当没有花费限制的时候,我们可以将其抽象为简单的背包问题 2.如果有了花费限制,那么我们就再加一维条件 3.如果一个线段能用,那么它前面一定是铺满的,那我们令线段按起点排序,通过某种运算,保证放这个线段时,前面的线段组成是最优的 比如在 点结尾位置花费 所达
阅读全文
摘要:原题链接 题解 太巧妙了!! 层加式? code #include<bits/stdc++.h> #define ll long long using namespace std; ll a[100005]={0}; int main() { ll t; cin>>t; while(t--) { l
阅读全文