
线性DP
小王子y
互关啊!!
展开
-
剑指Offer 骰子的点数(线性DP和DFS两种解法)
将一个骰子投掷 n 次,获得的总点数为 s,s 的可能范围为 n∼6n。掷出某一点数,可能有多种掷法,例如投掷 2 次,掷出 3 点,共有 [1,2],[2,1][ 两种掷法。请求出投掷 n 次,掷出 n∼6n 点分别有多少种掷法。样例1输入:n=1输出:[1, 1, 1, 1, 1, 1]解释:投掷1次,可能出现的点数为1-6,共计6种。每种点数都只有1种掷法。所以输出[1, 1, 1, 1, 1, 1]。样例2输入:n=2输出:[1, 2, 3, 4, 5, 6, 5, 4, 3原创 2021-03-12 00:10:08 · 188 阅读 · 0 评论 -
第十二届蓝桥杯大赛模拟赛(网上最后一题题解大部分是错的)
第十题问题描述 小蓝在一个 n 行 m 列的方格图中玩一个游戏。 开始时,小蓝站在方格图的左上角,即第 1 行第 1 列。 小蓝可以在方格图上走动,走动时,如果当前在第 r 行第 c 列,他不能走到行号比 r 小的行,也不能走到列号比 c 小的列。同时,他一步走的直线距离不超过3。 例如,如果当前小蓝在第 3 行第 5 列,他下一步可以走到第 3 行第 6 列、第 3 行第 7 列、第 3 行第 8 列、第 4 行第 5 列、第 4 行第 6 列、第 4 行第 7 列、第 5 行第 5 列原创 2021-02-23 00:03:06 · 2132 阅读 · 19 评论 -
2019蓝桥国赛 最优包含(线性DP)
我们称一个字符串 S 包含字符串 T 是指 T 是 S 的一个子序列,即可以从字符串 S 中抽出若干个字符,它们按原来的顺序组合成一个新的字符串与 T 完全一样。给定两个字符串 S 和 T,请问最少修改 S 中的多少个字符,能使 S 包含 T?输入格式输入两行,每行一个字符串。第一行的字符串为 S,第二行的字符串为 T。两个字符串均非空而且只包含大写英文字母。输出格式输出一个整数,表示答案。数据范围1≤|T|≤|S|≤1000输入样例:ABCDEABCDXAABZ输出样例:3原创 2021-02-19 00:52:54 · 359 阅读 · 0 评论 -
整数划分(DP)
一个正整数nn可以表示成若干个正整数之和,形如:n=n1+n2+…+nkn=n1+n2+…+nk,其中n1≥n2≥…≥nk,k≥1n1≥n2≥…≥nk,k≥1。我们将这样的一种表示称为正整数n的一种划分。现在给定一个正整数n,请你求出n共有多少种不同的划分方法。输入格式共一行,包含一个整数n。输出格式共一行,包含一个整数,表示总划分数量。由于答案可能很大,输出结果请对109+7取模。数据范围1≤n≤1000输入样例:5输出样例:7#include <iostream&g原创 2021-02-19 00:24:46 · 131 阅读 · 0 评论 -
鸣人的影分身(整数划分)
在火影忍者的世界里,令敌人捉摸不透是非常关键的。我们的主角漩涡鸣人所拥有的一个招数——多重影分身之术——就是一个很好的例子。影分身是由鸣人身体的查克拉能量制造的,使用的查克拉越多,制造出的影分身越强。针对不同的作战情况,鸣人可以选择制造出各种强度的影分身,有的用来佯攻,有的用来发起致命一击。那么问题来了,假设鸣人的查克拉能量为 M,他影分身的个数最多为 N,那么制造影分身时有多少种不同的分配方法?注意:影分身可以分配0点能量。分配方案不考虑顺序,例如:M=7,N=3M=7,N=3,那么 (2,原创 2021-02-19 00:11:59 · 441 阅读 · 0 评论 -
NOIP2010提高组 乌龟棋(线性DP)
小明过生日的时候,爸爸送给他一副乌龟棋当作礼物。乌龟棋的棋盘只有一行,该行有 N 个格子,每个格子上一个分数(非负整数)。棋盘第 1 格是唯一的起点,第 N 格是终点,游戏要求玩家控制一个乌龟棋子从起点出发走到终点。乌龟棋中共有 M 张爬行卡片,分成 4 种不同的类型(M 张卡片中不一定包含所有 4 种类型的卡片),每种类型的卡片上分别标有1、2、3、4 四个数字之一,表示使用这种卡片后,乌龟棋子将向前爬行相应的格子数。游戏中,玩家每次需要从所有的爬行卡片中选择一张之前没有使用过的爬行卡片,控制乌龟原创 2021-02-10 23:45:48 · 200 阅读 · 0 评论 -
友好城市(最长上升子序列)
#include <iostream>#include <algorithm>using namespace std;typedef pair<int, int> PII;const int N = 5010;int n;PII city[N];int f[N];int main(){ scanf("%d", &n); for (int i = 0; i < n; i ++ ) scanf("%d%d", &原创 2021-01-19 22:53:08 · 101 阅读 · 0 评论 -
拦截导弹
某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。输入导弹依次飞来的高度(雷达给出的高度数据是不大于30000的正整数,导弹数不超过1000),计算这套系统最多能拦截多少导弹,如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。输入格式共一行,输入导弹依次飞来的高度。输出格式第原创 2021-01-14 23:17:40 · 142 阅读 · 0 评论 -
最大上升子序列和(详细解析)
一个数的序列 bibi,当 b1<b2<…<bSb1<b2<…<bS 的时候,我们称这个序列是上升的。对于给定的一个序列(a1,a2,…,aNa1,a2,…,aN),我们可以得到一些上升的子序列(ai1,ai2,…,aiKai1,ai2,…,aiK),这里1≤i1<i2<…<iK≤N比如,对于序列(1,7,3,5,9,4,8),有它的一些上升子序列,如(1,7),(3,4,8)等等。这些子序列中和最大为18,为子序列(1,3,5,9)的和。你的任原创 2021-01-14 01:38:31 · 5020 阅读 · 3 评论 -
合唱队形(线性DP)
N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形。合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2,…,TK, 则他们的身高满足T1<…Ti+1>…>TK(1≤i≤K)你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。输入格式输入的第一行是一个整数N,表示同学的总数。第二行有n个整数,用空格分隔,第i个整数TiTi是第i位同学的身高(厘米)。输出原创 2021-01-14 01:24:48 · 175 阅读 · 0 评论 -
登山(最长上升子序列)
五一到了,ACM队组织大家去登山观光,队员们发现山上一个有N个景点,并且决定按照顺序来浏览这些景点,即每次所浏览景点的编号都要大于前一个浏览景点的编号。同时队员们还有另一个登山习惯,就是不连续浏览海拔相同的两个景点,并且一旦开始下山,就不再向上走了。队员们希望在满足上面条件的同时,尽可能多的浏览景点,你能帮他们找出最多可能浏览的景点数么?输入格式第一行包含整数N,表示景点数量。第二行包含N个整数,表示每个景点的海拔。输出格式输出一个整数,表示最多能浏览的景点数。数据范围2≤N≤1000输原创 2021-01-14 01:15:37 · 161 阅读 · 0 评论 -
怪盗基德的滑翔翼(最长上升子序列,最长下降子序列)
怪盗基德是一个充满传奇色彩的怪盗,专门以珠宝为目标的超级盗窃犯。而他最为突出的地方,就是他每次都能逃脱中村警部的重重围堵,而这也很大程度上是多亏了他随身携带的便于操作的滑翔翼。有一天,怪盗基德像往常一样偷走了一颗珍贵的钻石,不料却被柯南小朋友识破了伪装,而他的滑翔翼的动力装置也被柯南踢出的足球破坏了。不得已,怪盗基德只能操作受损的滑翔翼逃脱。假设城市中一共有N幢建筑排成一条线,每幢建筑的高度各不相同。初始时,怪盗基德可以在任何一幢建筑的顶端。他可以选择一个方向逃跑,但是不能中途改变方向(因为中森原创 2021-01-12 23:35:13 · 449 阅读 · 0 评论 -
方格取数(线性DP)
设有 N×N 的方格图,我们在其中的某些方格中填入正整数,而其它的方格中则放入数字0。如下图所示:某人从图中的左上角 A 出发,可以向下行走,也可以向右行走,直到到达右下角的 B 点。在走过的路上,他可以取走方格中的数(取走后的方格中将变为数字0)。此人从 A 点到 B 点共走了两次,试找出两条这样的路径,使得取得的数字和为最大。输入格式第一行为一个整数N,表示 N×N 的方格图。接下来的每行有三个整数,第一个为行号数,第二个为列号数,第三个为在该行、该列上所放的数。行和列编号从 1 开始。原创 2021-01-12 00:14:18 · 129 阅读 · 0 评论 -
传纸条(线性DP)
小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题。一次素质拓展活动中,班上同学安排坐成一个 m 行 n 列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了。幸运的是,他们可以通过传纸条来进行交流。纸条要经由许多同学传到对方手里,小渊坐在矩阵的左上角,坐标(1,1),小轩坐在矩阵的右下角,坐标(m,n)。从小渊传到小轩的纸条只可以向下或者向右传递,从小轩传给小渊的纸条只可以向上或者向左传递。在活动进行中,小渊希望给小轩传递一张纸条,同时希望小轩给他回复。班里每个同原创 2021-01-12 00:08:20 · 138 阅读 · 0 评论 -
最低通行费(线性DP)
一个商人穿过一个N×N的正方形的网格,去参加一个非常重要的商务活动。他要从网格的左上角进,右下角出。每穿越中间1个小方格,都要花费1个单位时间。商人必须在(2N-1)个单位时间穿越出去。而在经过中间的每个小方格时,都需要缴纳一定的费用。这个商人期望在规定时间内用最少费用穿越出去。请问至少需要多少费用?注意:不能对角穿越各个小方格(即,只能向上下左右四个方向移动且不能离开网格)。输入格式第一行是一个整数,表示正方形的宽度N。后面N行,每行N个不大于100的整数,为网格上每个小方格的费用。原创 2021-01-11 20:59:28 · 219 阅读 · 0 评论 -
PAT甲级真题1045 最佳彩色带(两种DP)
伊娃试图用一条原始色带给自己制作一条喜欢的色带。她会通过剪掉原始色带中多余的部分,将其余部分拼接起来,从而使得色带中只包含她喜欢的颜色,并且这些颜色按照她喜欢的顺序排列。据说正常的人眼只能分辨不到 200 种不同的颜色,因此伊娃喜欢的颜色数量是有限的。原始色带的长度可能会很长,她希望拼剪成的能够使她满意的色带也尽可能的长。因此,她需要你来帮她确定能够拼剪出的,使得她满意的色带的最大可能长度。注意,修剪方案可能并不唯一,例如给定颜色为 {2 2 4 1 5 5 6 3 1 1 5 6} 的色带,如果原创 2021-01-05 22:08:39 · 259 阅读 · 0 评论 -
PAT甲级真题1007 最大子序列和(线性DP)
给定一个包含 K 个整数的序列 {N1,N2,…,NK}。连续子序列定义为 {Ni,Ni+1,…,Nj},其中 1≤i≤j≤K。最大子序列是指序列内各元素之和最大的连续子序列。例如,给定序列 {−2,11,−4,13,−5,−2},它的最大子序列为 {11,−4,13},其各元素之和为 20。现在你需要求出最大子序列的各元素之和,并且输出最大子序列的第一个元素和最后一个元素的值。输入格式第一行包含一个整数 K。第二行包含 K 个整数。输出格式输出一行三个整数,分别表示最大子序列的各元素之和原创 2021-01-04 00:56:00 · 305 阅读 · 0 评论 -
编辑距离(带详细解析,So easy)
如果不熟悉,可以看下文编辑距离模板给定n个长度不超过10的字符串以及m次询问,每次询问给出一个字符串和一个操作次数上限。对于每次询问,请你求出给定的n个字符串中有多少个字符串可以在上限操作次数内经过操作变成询问给出的字符串。每个对字符串进行的单个字符的插入、删除或替换算作一次操作。输入格式第一行包含两个整数n和m。接下来n行,每行包含一个字符串,表示给定的字符串。再接下来m行,每行包含一个字符串和一个整数,表示一次询问。字符串中只包含小写字母,且长度均不超过10。输出格式输出共m行,原创 2020-12-24 11:07:48 · 112 阅读 · 0 评论 -
最短编辑距离 (线性DP超详细解析)
给定两个字符串A和B,现在要将A经过若干操作变为B,可进行的操作有:删除–将字符串A中的某个字符删除。插入–在字符串A的某个位置插入某个字符。替换–将字符串A中的某个字符替换为另一个字符。现在请你求出,将A变为B至少需要进行多少次操作。输入格式第一行包含整数n,表示字符串A的长度。第二行包含一个长度为n的字符串A。第三行包含整数m,表示字符串B的长度。第四行包含一个长度为m的字符串B。字符串中均只包含大写字母。输出格式输出一个整数,表示最少操作次数。数据范围1≤n,m≤1000原创 2020-12-24 10:47:33 · 267 阅读 · 0 评论 -
摘花生(线性DP)
Hello Kitty想摘点花生送给她喜欢的米老鼠。她来到一片有网格状道路的矩形花生地(如下图),从西北角进去,东南角出来。地里每个道路的交叉点上都有种着一株花生苗,上面有若干颗花生,经过一株花生苗就能摘走该它上面所有的花生。Hello Kitty只能向东或向南走,不能向西或向北走。问Hello Kitty最多能够摘到多少颗花生。输入格式第一行是一个整数T,代表一共有多少组数据。接下来是T组数据。每组数据的第一行是两个整数,分别代表花生苗的行数R和列数 C。每组数据的接下来R行数据,从北原创 2020-12-24 09:31:02 · 139 阅读 · 0 评论 -
最短编辑距离(线性DP)
给定两个字符串A和B,现在要将A经过若干操作变为B,可进行的操作有:删除–将字符串A中的某个字符删除。插入–在字符串A的某个位置插入某个字符。替换–将字符串A中的某个字符替换为另一个字符。现在请你求出,将A变为B至少需要进行多少次操作。输入格式第一行包含整数n,表示字符串A的长度。第二行包含一个长度为n的字符串A。第三行包含整数m,表示字符串B的长度。第四行包含一个长度为m的字符串B。字符串中均只包含大写字母。输出格式输出一个整数,表示最少操作次数。数据范围1≤n,m≤10001原创 2020-10-27 00:04:13 · 209 阅读 · 1 评论 -
最长公共子序列(线性DP)
给定两个长度分别为N和M的字符串A和B,求既是A的子序列又是B的子序列的字符串长度最长是多少。输入格式第一行包含两个整数N和M。第二行包含一个长度为N的字符串,表示字符串A。第三行包含一个长度为M的字符串,表示字符串B。字符串均由小写字母构成。输出格式输出一个整数,表示最大长度。数据范围1≤N,M≤10001≤N,M≤1000输入样例:4 5acbdabedc输出样例:3#include <iostream>#include <algorithm>原创 2020-10-26 23:22:36 · 301 阅读 · 0 评论 -
数字三角形(线性DP)
给定一个如下图所示的数字三角形,从顶部出发,在每一结点可以选择移动至其左下方的结点或移动至其右下方的结点,一直走到底层,要求找出一条路径,使路径上的数字的和最大。 7 3 88 1 02 7 4 44 5 2 6 5输入格式第一行包含整数n,表示数字三角形的层数。接下来n行,每行包含若干整数,其中第 i 行表示数字三角形第 i 层包含的整数。输出格式输出一个整数,表示最大的路径数字和。数据范围1≤n≤5001≤n≤500,−1000原创 2020-10-26 22:55:38 · 334 阅读 · 0 评论 -
最长上升子序列(线性DP)
给定一个长度为N的数列,求数值严格单调递增的子序列的长度最长是多少。输入格式第一行包含整数N。第二行包含N个整数,表示完整序列。输出格式输出一个整数,表示最大长度。数据范围1≤N≤10001≤N≤1000,−109≤数列中的数≤109−109≤数列中的数≤109输入样例:73 1 2 1 8 5 6输出样例:4#include <iostream>#include <algorithm>using namespace std;const in原创 2020-10-26 22:52:23 · 137 阅读 · 0 评论