- 博客(40)
- 收藏
- 关注
原创 动态规划模板-最长公共子序列
(2)此时和 (1)中类似,只不过 S[i] ≠ T[j],那么在当前位置需要修改,因此答案就是 f(i- 1,j- 1)+1。有了前面的基础,可以发现这个问题仍然可以按照序列的长度来划分状态公共子序列长度,也就是S1的前 i个字符和 S2的前 j个字符的最长,记为 lcs[i][j]。给定字符串S和T,我们要通过往这两个字符串当中加入一种特殊符号(这里用-代替),来让这两个字符串的长度相同并且“对齐”,如果两个串相同的位置出现了不同的字符,那么就扣1分,我们要让两个字符串对齐的扣分尽量少。
2024-03-20 12:48:29
548
原创 幻方奇数的解决
幻方也是一种中国传统游戏。旧时在官府、学堂多见。它是将从一到若干个数的自然数排成纵横各为若干个数的正方形,使在同一行、同一列和同一对角线上的几个数的和都相等。幻方(Magic Square)是一种将数字安排在正方形格子中,使每行、列和对角线上的数字和都相等的方法。//4.行、列都未越界,但位置被占用。//通过命令行,输入转换幻方的阶数。//1.行越界,列未越界。//2.列越界,行未越界。//3.行、列都越界。//创建一个n*n二维数组。//打印幻方(二维数组)//定义行、列下标变量。
2024-03-20 11:02:03
795
原创 动态规划模板-最长上升子序列LIS
在原序列取任意多项,不改变他们在原来数列的先后次序,得到的序列称为原序列的子席列。最长上升子席列、就是给定序列的一个最长的、数值从低到高排列的子序列,最长上升子序列不一定是唯一的。例如,序列2,1,5,3,6,4,6,3的最长上升子序列为1.3.4.6和2.3.4.6,长度均为 4。用a[i]表示第 i 项的值,如果有j < i且a[j]<a[i],那么把第 i 项接在第 j 项后面构成的子序列长度为:dp[i]= dp[j]+ 1.最后,ap数组里面的最大值就是最长上升子序列的长度了。
2024-03-19 21:12:57
366
原创 动态规划-过桥
在一个夜黑风高的晚上,有几个小朋友在桥的这边,现在他们需要过桥,但是由于桥很窄,每次只允许不超过两人通过,他们只有一个手电简,所以每次过桥后,需要有人把手电筒带回来,第:号小朋友过桥的时间为 a,两个人过桥的总时间为二者中时间长者。// 让0号来送手电并且和i号和i-1号一起走 or 一号送手电并且和零号一起回去。第二行有 几 个整数 a: ,a: 表示第之个小朋友过河需要的时间(0 < ai ≤ 1000)第一行输入一个整数n(1≤n≤1000),表示有 n 个小朋友。
2024-03-19 20:14:48
216
原创 动态规划-涂墙面
赫头君觉得白色的墙面好单调,他决定给房间的墙面涂上颜色。他买了3种颜料分别是红、黄、蓝,然后把房间的墙壁竖直地划分成 几个部分,蒜头希望每个相邻的部分颜色不能相同。// 三种颜色,a[i]=a[i-1]+a[i-2]*2,a[i-1]是说第一和第n-1部分颜色不同,那么第n部分只能涂一种颜色,// a[i-2]*2如果第一和第n-1部分颜色相同,那么第n部分就有两种颜色可选。一个整数 n,表示房间被划分成多少部分。由于墙壁是一个环形,所以下面这个方案就是不合法的。例如,当n=5时,下面就是一种合法方案。
2024-03-19 19:47:16
216
原创 动态规划-数组最大权值和
一个长度为 n的数组 a,我们可以把它分成任意组,每一组是一段连续的区间。比如数组1,2,3,4,5 可以分成(1,2),(3,4,5)两个组。// 将前j位划分为一组和j+1到i位划分为一组。每个分组都有一个权值,这个权值就是分组里面每个数的乘积对 1000 取模的结果。// p[i]p[j]是从i到j为一组的权值和。// 预处理出来每段分组造成的权值和。对于数组 a的一个分组方案,总权值就是每个分组的权值和。// 考虑最后一组分的是哪一组,不考虑前面,数组最大的分组权值和。
2024-03-19 19:33:18
316
原创 动态规划-一维消消乐
游戏是这样,你可以选择如若干对相邻的珠子,让他们同时消去。每一对珠子的消失,都会使得总分数加上两颗珠子相乘的分数。注意,每个珠子只能消一次,并且珠子消去以后,还会占位。// 1代表和前面组合,0则没有。有几颗珠子排成一排,每一颗珠子有一个价值w;接下来一行输入 几个整数w(-1000 ≤w: ≤ 1000)。// 第一个无法和前面组合,所以为 0。输入第一行一个整数n(1≤n≤10000)
2024-03-18 21:56:32
356
原创 动态规划-爬楼梯
/ 上一级台阶有一种方法 上两个台阶有两种方法(1+1,2)三级:(1+1+1,1+2,2+1)n = (n - 1) + (n - 2)为了选出一种最轻松的爬楼梯的方式,蒜头君想把所有不同的到达楼顶的方式都尝试一遍。对于一共有几个阶梯的楼梯,蒜头君一共有多少总方法从楼底到达楼顶。蒜头君最多只能一步跨越两个阶梯。比如他初始在楼底,跨越一个阶梯到达1号阶梯,或者跨越两个阶梯到达 2号阶梯。由于最后答案可能很大,输出最后的答案对100007 取模的结果。第一行输入一个整数 n(1 ≤ n ≤ 1000)。
2024-03-17 21:27:40
344
原创 动态规划-最小值(三维dp)
我们用 f[i][j][k]来表示蒜头君当前所在位置,我们可以知道蒜头君是一步到达这个位置的。这个时候我们就可以知道当前位置会来自 f[i-1][j][k],f[i][j - 1][k],f[i][j][k -1]这三个位喜。所以我们我们只需要找到前三个状态的最小值,然后在加上当前位署消耗的体力值,就是蔬头君到认当前位置需要消耗体力的最小值。// 然后我们把最小值加给 f[i][j][k],到这我们就算是完成了。请在 return 0;
2024-03-17 21:03:54
409
原创 动态规划(dp)-捡水果
这是一个高度为4的山,数字代表水果的能量。每次下一个高度,蒜头君需要选择是往左下走,还是往右下走。例如:对于上图的情况,蒜头君能获得的最大能量为,3+1+6+5=15。现在,蒜头君希望你能帮他计算出下山能获得的最大能量。蒜头君在玩一款游戏,他在一个山顶,现在他要下山,山上有许多水果,蒜头君每下一个高度就可以捡起一个水果,并且获得水果的能量。// 从1 1 开始访问更加方便 从 i = 1开始一直加到n层。// 从1 1开始存储 以便于之后不用判是否越界。所以我们接下来,根据状态转移方程实现代码就可以了。
2024-03-17 15:12:42
371
原创 动态规划(dp)-最优路径
那么点(i,j)要么是从(i- 1,j)走到(i,j),要么是从点(i,j - 1)走到(i,j)。接下来,我们用 dp(i,j)来代表走到点(i,j)一共花费的最少体力。我们需要花费最少力气走到家,所以可以得到状态转移方程:dp(i,j)= min(dp(i-1,j),dp(i,j-1))+ aij。对于图中的边界点,要在转移前加上判断是否为边界,如:点(1,3)只能从点(1,2)走过来,点(3,1)只能从点(2,1)走过来等等。// 将起点情况排除。// 从1 1开始,以1 1为起点。
2024-03-17 14:07:51
930
原创 动态规划dp-过河卒
马控制的点的路径数一定是 0,这样其实并不影响我们做递推,只要遇到了马控制的点,直接设置为0就可以了。我们可以用两个一维数组来表示马的横向位移和纵向位移,这样来方便我们计算马的控制点,然后使用一个二维数组来标记某个点是否是马控制的点。同时在棋盘上的任一点有一个对方的马(如上图的 C 点),该马所在的点和所有跳跃一步可达的点称为对方马的控制点。我们用 ,来表示到达点(i,j)的路径数目。棋盘用坐标表示,A点 (0,0)、B点(n,m)、℃点(c,c)(0<c<n≤20,0<c <m≤20)。
2024-03-17 11:15:04
1695
原创 bfs广度优先搜索-迷宫问题最优解
/ 如果找到终点则一层层返回 因为是now的下一层所以返回d+1(比放到最前面少调用一次)}else { // 没找到终点则新元素入队。// 队列不空则出队队首元素并记录队首元素于now中。// 将当前位置的四个方向可访问元素入队。// 判断元素是否可以入队。// 遍历完所有可访问位置且没有找到T返回。// 类 记录当前 坐标x y 步数d 的状态。// 标记当前位置已被访问。// 把当前位置入队。
2024-03-16 17:50:37
353
原创 蓝桥杯真题-召唤师峡谷の踏青(dfs搜索最大连通子块个数)
他们发现召唤师峡谷的地图是由一块一块格子组成的,有的格子上是草丛,有的是空地。草丛通过上下左右 4个方向扩展其他草丛形成一片草地,任何一片草地中的格子都是草丛,并且所有格子之间都能通过上下左右连通。如果用'#'代表草丛,'.'代表空地,下面的峡谷中有 2片草地。处在同一个草地的 2个人可以相互看到,空地看不到草地里面的人。他们发现有一个朋友不见了,现在需要分头去找,每个人负责一片草地,蒜头君想知道他们至少需要多少人。// 排除不合法情况,已经访问过的和不需要的情况。接下来输入几 行字符串表示峡谷的地形。
2024-03-16 14:57:24
758
原创 蓝桥杯算法-迷宫问题最优解(dfs)
/ 字符串数组用于给字符数组赋值。// 方向数组(x,y 的增量)(逆时针),用于给当前位置加数表示从当前位置,往上 左 下 右 移动。// 判断当前位置是否合法(在迷宫数组中没有越界)// 先找出起始点,才能知道从哪开始搜。// 取消标记,因为以后还要搜。} // 串数组给字符数组赋值。// 找到终点,打出地图。// 返回能不能走出去。
2024-03-16 13:55:09
461
原创 蓝桥杯真题-象棋の马(dfs)
我们都知道象棋中马走“日",比如在(2,4)位置的一个马,跳一步能到达的位置有(0,3),(0,5),(1,2),(1,6),(3,2),(3,6),(4,3),(4,5)。但是棋盘大小有限制,棋盘是一个10x9的网格,左上角坐标为(0,0),右下角坐标为(9,8),马不能走出棋盘,并且有些地方已经有了棋子,马也不能跳到有棋子的点。输入表示这个棋盘,我们用' . '表示空位置,用' # ’表示该位置有棋子,用' S '表示初始的马的位置,用"T’表示马需要跳到的位置。// 找起点 'S'
2024-03-16 13:21:21
1518
原创 蓝桥杯算法dfs迷宫问题优化
/ 字符串数组用于给字符数组赋值。// 方向数组(x,y 的增量)(逆时针),用于给当前位置加数表示从当前位置,往上 左 下 右 移动。// 判断当前位置是否合法(在迷宫数组中没有越界)// 该点不行,返回上一级尝试下一个方向。// 先找出起始点,才能知道从哪开始搜。// 如果找不到终点则取消标记。} // 串数组给字符数组赋值。// 找到终点,打出地图。// 返回能不能走出去。
2024-03-16 08:49:52
347
原创 蓝桥杯算法-dfs(深度优先遍历)
/ 字符串数组用于给字符数组赋值。// 保证该位置在数组内,且不是墙壁,且未被访问过(如果之前被访问过说明之前的路径无法走出迷宫)// 如果没找到,则将当前位置标记为未被访问,方便下一次dfs。// 没找到,将路径恢复成原状,方便下次dfs。// 判断当前位置是否合法(在迷宫数组中没有越界)// 为了展示路径,将走过的路改成m。} // 串数组给字符数组赋值。// 往上走不通 开始往左走。// 往左走不通 开始往下走。// 往下走不通 开始往右走。// 标记当前位置已访问过。// 找到终点,打出地图。
2024-03-15 18:51:55
342
1
原创 蓝桥杯真题-切蛋糕(dfs)
/ 每个位置dfs之前将cnt清零,表示每种可能连接的情况 找其中最大的。// 如果当前位置没有被访问过,并且这位为#执行。// 判断当前位置是否越界或不符合条件。// 合法则将对应bool数组置1。// 找最大连接蛋糕块数 cnt。
2024-03-14 21:18:38
369
2
原创 蓝桥杯真题-网站访问
/ 后退情况,栈1要始终保持1个基网站,如果栈1的网站数大于1,则弹出一个,让下面的网址成为栈顶,等到循环体最后输出,并将其压入栈2。// 前进情况,先看2栈是否有值,如果没有则无法前进,有则将栈2栈顶元素放入栈1栈顶。// 访问情况,栈2不空则弹出(因为无法前进了),将当前网站压入栈1。// 装入被弹出的网站,以便于前进访问。// 装入当前及之前网站。
2024-03-14 16:45:05
337
1
原创 蓝桥杯真题-最大出现次数
/ 本来下面想用TreeSet来着,但是Idea说多余...// Map 本身就是升序排序 所以不用考虑重复次序。// 输入并判断是否已存在于 map 里。
2024-03-13 12:20:00
318
1
原创 蓝桥杯真题-
/ 不会添加重复值。// 直接往 A 中加入 n + m 个元素。// 用一个变量和 A.size()控制换行。// 树集合自带排序功能。
2024-03-13 08:21:15
389
1
原创 蓝桥杯真题-积木
/ b 数组把积木放到 a 数组上后清空数组 表示b数组积木全部清空。// 如果 a b 相同则跳出本次循环 执行下次循环。// 把 b 数组的全部积木放到 a 数组上。// 从下往上依次输出每个数组的内容 没有则输出空格。// n块积木,所以开n个数组。// 对应数组放入对应数字。
2024-03-13 07:36:48
366
1
原创 蓝桥杯真题-盗窃案
/ 创建人类并重写equals和hashcode方便比较人类值。// 重写equals和hashcode方便比较人类值。// 询问set集合里是否有该嫌犯。// 设定set用来装入全市人民。// n个市民 m个嫌犯。// 人类数组存嫌犯。
2024-03-12 20:46:43
320
原创 蓝桥杯真题-锯齿矩阵(动态数组)
/ 往动态数组里装数前必须 定义 新动态数组 否则空指针。// 定义动态数组类型的 数组 mat。// x 为数组下标,y 为值。// 往不同数组中装入不同值。// 开多少个动态数组。
2024-03-12 20:10:34
346
1
原创 蓝桥杯真题目-最大部分数组和
/ 从每个不同起点依次将后面数组数据相加取最大和。// 从数组不同起点开始遍历寻找最大部分数组和。// 每次循环sum清零。
2024-03-10 21:35:10
328
1
原创 蓝桥杯真题-机器人坐标
/ 四个方向 如果是f的话就不用转方向 最后直接移动。//两个方向数组前 左 后 右。// 四个方向共用一个移动。注意:每次转向是再上一次转向后的基础上继续转向。// 表示初始方向为右。
2024-03-10 14:34:00
358
1
原创 蓝桥杯真题-给一整数用翻转加法将其变成回文数
int x = 0;a[x++] = n;while(!judge(n)){a[x++] = n;i < x;i++) {while(n!= 0){n /= 10;return sum;int x= 0;while (n!= 0){n /= 10;i < x / 2;i++) {if(c[i]!
2024-03-10 12:36:30
333
1
原创 蓝桥杯真题-给一个整数去和11-16进制,将其转换成对应进制
/ if N < 0 则直接输出符号,将其取反后按正数算。则上面循环则不会执行。// 直接输出 0;// 保持最后换行的格式。
2024-03-10 09:22:11
337
原创 蓝桥杯真题-数组部分升降序排序
/ 数组降序排序 数组必须是Integer才能用Collection.reverseOrder();// 左闭右开所以+1。
2024-03-09 19:53:42
301
1
原创 蓝桥杯-整数数组去重排序
蒜头君想在学校中请一些同学一起做一项问卷调查,为了确保实验的客观性,他先用计算机生成了n(1≤n≤100)个1到1000 之间的随机整数,对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。= a[i - 1] ) // 最后一个数没有与他比较的,无法将其送入新数组。第二行有几个用空格隔开的正整数,为所产生的随机数。请你协助蒜头君完成“去重”与“排序”的工作。
2024-03-09 19:24:40
324
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人