![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
dp
文章平均质量分 69
⊱⋛赫宇⋚⊰
这个作者很懒,什么都没留下…
展开
-
P7961 [NOIP2021] 数列
给定整数n,m,k,和一个长度为m+1的正整数数组v0,v1,…,vm。对于一个长度为n,下标从1开始且每个元素均不超过m的非负整数序列{ai},我们定义它的权值为va1×va2×⋯×van。当这样的序列{ai}满足整数S=2a1+2a2+⋯+2an的二进制表示中1的个数不超过k时,我们认为{ai}是一个合法序列。原创 2022-11-16 14:54:15 · 613 阅读 · 1 评论 -
CF1481E Sorting Books
你现在要整理书架上的n本书,每本书有一个颜色ai,当每种颜色的书都摆在一起时书架上便整齐了,你每次可以将一本书放到序列最右端,问使书架上整齐的最小操作数。原创 2022-10-09 19:48:07 · 221 阅读 · 0 评论 -
汉诺塔问题
汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘fi=fi−1∗2+1通项公式2n−1。原创 2022-10-05 18:44:11 · 458 阅读 · 0 评论 -
特别行动队
维护前面的是不是需要,直接单调队列维护凸包就好了。原创 2022-07-21 15:51:35 · 141 阅读 · 0 评论 -
完全背包深入探究
dp原创 2022-07-15 19:13:36 · 145 阅读 · 0 评论 -
最长公共上升子序列
算法(DP,线性DP,前缀和) O(n2)O(n2)这道题目是AcWing 895. 最长上升子序列和AcWing 897. 最长公共子序列的结合版,在状态表示和状态计算上都是融合了这两道题目的方法。状态表示:f[i][j]代表所有a[1 ~ i]和b[1 ~ j]中以b[j]结尾的公共上升子序列的集合;f[i][j]的值等于该集合的子序列中长度的最大值;状态计算(对应集合划分):首先依据公共子序列中是否包含a[i]a[i]a[i],将f[i][j]f[i][j]f[i][j]所代表的集合划分原创 2021-11-30 20:22:23 · 92 阅读 · 0 评论 -
矩阵乘法相关内容
矩阵乘法内容简介矩阵相乘最重要的方法是一般矩阵乘积。它只有在第一个矩阵的列数(column)和第二个矩阵的行数(row)相同时才有意义 。一般单指矩阵乘积时,指的便是一般矩阵乘积。一个m×n的矩阵就是m×n个数排成m行n列的一个数阵。由于它把许多数据紧凑地集中到了一起,所以有时候可以简便地表示一些复杂的模型定义设AAA为 n∗mn*mn∗m 的矩阵,BBB为 m∗qm*qm∗q 的矩阵,那么称 的矩阵C=n∗qC=n*qC=n∗q,并且必须满足矩阵A矩阵A矩阵A的列和矩阵B的行数矩阵B的行数矩原创 2021-08-01 22:38:22 · 260 阅读 · 0 评论 -
P2854 [USACO06DEC]Cow Roller Coaster S(DP)
题目链接额,为了提升一下自己动规的能力,就找的了这道题。题目意思很简单,就是给你几条边让你铺满[0..L][0..L][0..L],在花费不超过BBB的条件下,求最大价值VVVdp状态的定义f[i][j]表示铺设到第i个位置,总花费为j,能获得的最大价值f[i][j]表示铺设到第i个位置,总花费为j,能获得的最大价值f[i][j]表示铺设到第i个位置,总花费为j,能获得的最大价值初始化因为是要求最大价值V,所以要把数组初始化为最小值,但是最大的价值肯定是>=0>=0>=0,所以原创 2021-07-19 13:54:47 · 120 阅读 · 0 评论 -
义乌集训Day10 T2
题目链接白云开着飞机带白兔来到了一座城市,这座城市有 n个景点。这座城市的道路非常有意思,每个景点都恰好存在一条通往其它某个节点的单向道路。现在白云可以把飞机降落在任何一个景点,然后让白兔独自旅行。当白兔旅行结束时,白云会到白兔所在的景点来接它。而在旅行的中途,白兔只能靠城市的道路来移动。现在白兔想制定一个旅游的顺序,按照这个顺序依次前往每一个景点。在每个景点游玩会消耗白兔一定的体力值。为了让白兔有充足的信心,我们的这个方案必须满足:每次游览景点所消耗的体力值必须 严格 比前一个景点消耗的体力值要小原创 2021-07-17 22:24:59 · 88 阅读 · 0 评论 -
义乌集训Day 9 T2
题目链接又是一道特别简单的题目我竟然没有想到做法模拟赛的时候想两个区间怎么操作结果想不到没想到正解就是最大子段和,前面一遍,往后面一遍,然后枚举中间分在哪里就好了#include<bits/stdc++.h>#define int long longusing namespace std;const int N=1e6;int n,a[N];int pre[N],suf[N],ans;signed main(){// freopen("number.in","r",std原创 2021-07-16 19:05:11 · 82 阅读 · 0 评论 -
义乌集训Day7 T2
题目链接一道sb dp我调了2.5h,还没有过大样例,真的是服了medp[i]表示到i个位置,最少需要告诉的次数dp[i]表示到i个位置,最少需要告诉的次数dp[i]表示到i个位置,最少需要告诉的次数每次的i向后转移if(j!=n)dp[j]=min(dp[j],dp[i]+1)if(j!=n)dp[j]=min(dp[j],dp[i]+1)if(j!=n)dp[j]=min(dp[j],dp[i]+1)if(j==n)dp[j]=min(dp[j],dp[i])就因为没有想到这个分类讨论,搞了很原创 2021-07-14 22:53:06 · 77 阅读 · 0 评论 -
义乌集训Day 6 T2
题目链接懒得写了,之后补#include<bits/stdc++.h>#define I inline#define RI register int#define rep(i,a,b) for(RI i=a;i<=b;++i)#define dow(i,a,b) for(RI i=a;i>=b;--i)using namespace std;const int N=1e6+5,M=63,mo=998244353;I int add(int a,int b) { r原创 2021-07-14 22:25:18 · 87 阅读 · 0 评论 -
义乌集训Day 6 T3
题目描述给定一棵大小为 n的有根树。每个节点有个非负权值,对于每个节点 x,我们找到包含 x 的节点的平均值最大的连通块,定义 f(x) 为这个平均值。请求出minf(i)│i∈1,2,…,nminf(i)│i∈1,2,…,n。min {f(i)│i∈{1,2,…,n} }minf(i)│i∈1,2,…,n。minf(i)│i∈1,2,…,nminf(i)│i∈1,2,…,n。看到这题不会换根dp,即使是想到做法了也好像实现不出来,所以当老师和jxc讲的时候就一下子悟了突破1:题目叫我们求的是最大值原创 2021-07-14 22:21:52 · 98 阅读 · 0 评论 -
义乌集训Day 4 T3
题目链接通过题目可以看到,每个点 的度数都是小于3的,而且每个点只可能最多属于一个简单环,所以我们可以考虑用dfs 找到每一个环然后将每个环缩减成为一个点再将其和原来的边进行重新连边然后我们就可以发现,建完新图之后的题目就简化成了一棵树然后又可以发现一条性质:两个简单环之间的路径数目就是就是 两个简单环之间个数的2k,因为每一个路径都可以分为上下两种走法之后就进行树形DPf[x]表示以x点位节点的半个眼镜有多少个f[x]表示以x点位节点的半个眼镜有多少个f[x]表示以x点位节点的半个眼镜有多少原创 2021-07-12 21:58:56 · 78 阅读 · 0 评论 -
P4170 [CQOI2007]涂色(区间dp)
题目链接题目大意很简单,就是求一个空串对其进行最小几次操作,可以变为目标串:每次的操作定义为:连续一个区间都改变为同一字母样例:RBGBR1.RRRRR2.RGGGR3.RGBGR从对区间的操作和,1-n一段的最小值,可以判断为区间dp设 f[i][j] 表示将第i到第j个字符涂成目标子串的最小代价思路详解初始化1.因为取得的是操作成目标子串的最小代价,所以一开始要将所有的点初始化为最大值2.对于每个长度为1的区间 也就是 f[i][i] 自己图自己 代价就是1循环枚举根据区间d原创 2021-07-05 15:25:21 · 86 阅读 · 0 评论 -
P2769 猴子上树
这是2020忍着T2打出正解,对拍把=搞掉,最后循环少了个=爆0,240左右的分数已经无法省一的心痛打的题解题目部分数据我们可以想出dp[i][j]表示前i个猴子上j课树最小的代价f[i][j]=min(f[i-1][j],f[i-1][j-1])+abs(mon[i]-tree[j]);1.表示从前i-1个猴子,上前j-1棵树,这个猴子自己一个人上这个的代价2.这个猴子和前面猴子上一棵树3.加上上的代价4.开始对两个坐标进行排序,贪心,这样就是最优100%对于这道题目,它的内存限制.原创 2020-11-15 08:24:27 · 295 阅读 · 0 评论 -
班服
班服(shirt.pas/c/cpp)【题目描述】要开运动会了,神犇学校的 n 个班级要选班服,班服共有 100 种样式,编号 1~100。现在每个班都挑出了一些样式待选,每个班最多有 100 个待选的样式。要求每个班最终选定一种样式作为班服,且该班的样式不能与其他班级的相同,求所有可能方案的总数,由于方案总数可能很大,所以要求输出 mod1000000007 后的答案。【输入格式】共有 T 组数据。对于每组数据,第一行为一个整数 n,表示有 n 个班级。第 2 到第 n+1 行,每行.原创 2020-11-04 17:16:38 · 151 阅读 · 0 评论 -
P1395 会议
题目加强版,改一下a[i],和边权就好通过先到一个点的距离,然后去遍历所有点#include<bits/stdc++.h>#define ll long longusing namespace std;inline ll read(){ ll ret=0,f=1;char ch=getchar(); while (ch<'0'||ch>'9') {if (ch=='-') f=-f;ch=getchar();} while (ch>='0'&&原创 2020-11-04 16:43:01 · 111 阅读 · 0 评论 -
P2647 最大收益
题目描述现在你面前有n个物品,编号分别为1,2,3,……,n。你可以在这当中任意选择任意多个物品。其中第i个物品有两个属性Wi和Ri,当你选择了第i个物品后,你就可以获得Wi的收益;但是,你选择该物品以后选择的所有物品的收益都会减少Ri。现在请你求出,该选择哪些物品,并且该以什么样的顺序选取这些物品,才能使得自己获得的收益最大。注意,收益的减少是会叠加的。比如,你选择了第i个物品,那么你就会获得了Wi的收益;然后你又选择了第j个物品,你又获得了Wj-Ri收益;之后你又选择了第k个物品,你又获得了Wk-R原创 2020-10-18 19:17:38 · 163 阅读 · 0 评论 -
阿瓦的礼物
题目描述阿瓦是一只自称萝莉的小花猫,她生活在幻想世界。今天是阿瓦的生日,她邀请了她的朋友们来参加生日宴会。她的朋友们各带了一件礼物到达阿瓦的家里,因为这些礼物实在是太多啦,阿瓦就把它们都放进了房间里,然 后出去切蛋糕去了。阿瓦的许完了生日愿望之后吹灭了蜡烛,就在这个时刻,她听到了来自房间的一声巨响。跑过 去时候发现,所有的礼物都变成了一摊灰,有人送给阿瓦的礼物是一颗炸弹!阿瓦非常的伤心,因为她回忆了礼物的大小形状后发现,炸弹可能还不止来源于一个朋友。首先,她记得每件 礼物对应的体积 Vi,阿瓦根据.原创 2020-08-25 15:35:22 · 206 阅读 · 0 评论 -
P1095 守望者的逃离
P1095题目描述恶魔猎手尤迪安野心勃勃,他背叛了暗夜精灵,率领深藏在海底的娜迦族企图叛变。守望者在与尤迪安的交锋中遭遇了围杀,被困在一个荒芜的大岛上。为了杀死守望者,尤迪安开始对这个荒岛施咒,这座岛很快就会沉下去。到那时,岛上的所有人都会遇难。守望者的跑步速度为17m/s17m/s,以这样的速度是无法逃离荒岛的。庆幸的是守望者拥有闪烁法术,可在1s1s内移动60m60m,不过每次使用闪烁法术都会消耗魔法值1010点。守望者的魔法值恢复的速度为44点/s/s,只有处在原地休息状态时才能恢复。现在已知原创 2020-07-28 15:41:42 · 131 阅读 · 0 评论 -
[Croatian2010] Zuma(区间DP)
Description有一行 N 个弹子,每一个都有一个颜色。每次可以让超过 K 个的连续的同颜色的一段 弹子消失,剩下的会重新紧凑在一起。你有无限的所有颜色的弹子,要求在这行弹子中插入 最少的弹子,使得弹子全部消失。InputThe first line of input contains two integers N (1 ≤ N ≤ 100) and K (2 ≤ K ≤ 5) - the number of marbles in the initial sequence and the mi.原创 2020-07-28 08:56:29 · 147 阅读 · 0 评论 -
基因合成 回文树+dp
Description—————————————————————————————————————60%#include<bits/stdc++.h>//q区间DPusing namespace std;int dp[250][250],n;char s[250];bool huiwen(int l,int r)//判断是否回文 { for(int i=l;i<=r;i++) if(s[i]!=s[r-i+l])return false ; return tru原创 2020-07-19 09:46:11 · 159 阅读 · 0 评论