【CSDN 竞赛—第10期】所有题目解法的思考和总结
创始人
2024-02-09 16:22:22

目录

一、 熊孩子拜访

二、 走楼梯

三、括号上色

四、喜水青蛙


一、 熊孩子拜访

已知存在一个长度为n的整数序列A。 A中所有元素按照从小到达的顺序进行排序。 现在执行操作倒置一段序列。 请找到A序列里的倒置子序列。

我的解题思路(通过所有测试用例): 

class Solution:def __init__(self) -> None:passdef solution(self, n, arr):result = []# 保存右值max = 0# 保存左值min = 0next = 0for item in arr:if next>item and item>max:max=nextmin=itemelif nextmax:min=nextnext=itemresult.append(str(min))result.append(str(max))if len(result)==0:result=["0","0"]return resultif __name__ == "__main__":n = int(input().strip())arr = [int(item) for item in input().strip().split()]sol = Solution()result = sol.solution(n, arr)print(" ".join(result))

输入描述:第一行输入整数 n ,第二行输入 n 个整数(1<=n<=1000)

输出描述:输出被倒置的数列的左值和右值,如果没有,输入0 0

例如:

 

 


二、 走楼梯

现在有一截楼梯, 根据你的腿长, 你一次能走 1 级或 2 级楼梯, 已知你要走 n 级楼梯才能走到你的目的楼层, 请实现一个方法, 计算你走到目的楼层的方案数。

我的解题思路:

class Solution:def __init__(self) -> None:passdef solution(self, n):if isinstance(n, int) and n > 0:basic_dic = {1: 1, 2: 2}if n in basic_dic.keys():return basic_dic[n]else:return self.solution(n - 1) + self.solution(n - 2)else:return Falseif __name__ == "__main__":n = int(input().strip())sol = Solution()result = sol.solution(5)print(result)

输入和输出: 


如果采用非递归,如何实现呢?——递推法

类似的一道题:一栋楼有N阶楼梯,兔子每次可以跳1、2或3阶,问一共有多少种走法?

def solution(n):if isinstance(n,int) and n > 0:# 如果台阶数总共有3个,那么有4种走法:# 1 1 1 # 1 2# 2 1# 3    # 如果n为4,有7种走法# 1 3# 3 1# 22# 1111# 211# 121# 112# 有4级台阶# temp=1,h1=2,h2=4,h3=1+2+4,返回7# 有5级台阶# temp=1,h1=2,h2=4,h3=1+2+4# temp=2,h1=4,h2=1+2+4,h3=2+4+1+2+4,返回13h1,h2,h3 = 1,2,4basic_dic = {1:1,2:2,3:4}if stairs in basic_dic.keys():return basic_dic[n]else:while n>=4:temp = h1h1 = h2h2 = h3h3 = temp + h1 + h2n-=1return h3else:return False
# 总结:
# 如果一次可以走1、2或3步的话,那么:第N级楼梯的走法是N-1级楼梯的走法+N-2级楼梯的走法+N-2级楼梯的走法


三、括号上色

小艺酱又得到了一堆括号。 括号是严格匹配的。 现在给括号进行上色。 上色有三个要求: 1、 只有三种上色方案, 不上色, 上红色, 上蓝色。 2、 每对括号只有一个上色。 3、 相邻的两个括号不能上相同的颜色, 但是可以都不上色。 问括号上色有多少种方案? 答案对1000000007取模。

以下代码参考:

【3.29百度笔试编程解析】CodeForces 149D 括号染色问题 dp+dfs好题_和你在一起^_^的博客-CSDN博客题目大意给一个给定括号序列,给该括号上色,上色有三个要求1、只有三种上色方案,不上色,上红色,上蓝色2、每对括号必须只能给其中的一个上色3、相邻的两个不能上同色,可以都不上色题目分析求0-len-1这一区间内有多少种上色方案,很明显的区间DPdp[l][r][i][j]表示l-r区间两端颜色分别是i,j的方案数0代表不上色,1代表上红色,2代表上蓝色对于l-r区间,有3种情况1...https://blog.csdn.net/weixin_42462804/article/details/105194872

import syss = input()
num = strlen = len(s)
tmp = [0 for i in range(num)]  # 记录左括号的位置
match = [0 for i in range(num)]  # 记录右匹配的位置
dp = [[[[0 for i in range(3)] for i in range(3)] for i in range(num)] for i in range(num)]
# 由内向外建立多维dp 数组的形式
# dp=np.arange(3*3*num*num).reshape(num,num,3,3)
# 0代表不上色,1代表上红色,2代表上蓝色
mod = 1000000007def getmatch(len):p = 0for i in range(len):if (s[i] == '('):tmp[p] = ip = p + 1else:match[i] = tmp[p - 1]match[tmp[p - 1]] = ip = p - 1def dfs(l, r):if (l + 1 == r):  # 边界条件dp[l][r][0][1] = 1dp[l][r][1][0] = 1dp[l][r][0][2] = 1dp[l][r][2][0] = 1returnif (match[l] == r):  # 如果匹配的话方案数相加dfs(l + 1, r - 1)for i in range(3):for j in range(3):if (j != 1):dp[l][r][0][1] = (dp[l][r][0][1] + dp[l + 1][r - 1][i][j]) % mod;if (i != 1):dp[l][r][1][0] = (dp[l][r][1][0] + dp[l + 1][r - 1][i][j]) % mod;if (j != 2):dp[l][r][0][2] = (dp[l][r][0][2] + dp[l + 1][r - 1][i][j]) % mod;if (i != 2):dp[l][r][2][0] = (dp[l][r][2][0] + dp[l + 1][r - 1][i][j]) % mod;returnelse:  # 否则方案数相乘,乘法原理p = match[l]dfs(l, p)dfs(p + 1, r)for i in range(3):for j in range(3):for k in range(3):for q in range(3):if not ((k == 1 and q == 1) or (k == 2 and q == 2)):dp[l][r][i][j] = (dp[l][r][i][j] + (dp[l][p][i][k] * dp[p + 1][r][q][j]) % mod) % modif __name__ == '__main__':getmatch(strlen)dfs(0, strlen - 1)ans = 0for i in range(3):for j in range(3):ans = (ans + dp[0][strlen - 1][i][j]) % mod;sys.stdout.write(str(ans))

本题属于括号匹配,用到区间上的动态规划(DP),可以参考以下博文学习入门:

区间dp入门_阿阿阿安的博客-CSDN博客_区间dp一.什么是区间dp?顾名思义:区间dp就是在区间上进行动态规划,求解一段区间上的最优解。主要是通过合并小区间的 最优解进而得出整个大区间上最优解的dp算法。二.核心思路既然让我求解在一个区间上的最优解,那么我把这个区间分割成一个个小区间,求解每个小区间的最优解,再合并小区间得到大区间即可。所以在代码实现上,我可以枚举区间长度len为每次分割成的小区间长度(由短到长不断合并),内层枚举该长度下可以的...https://blog.csdn.net/qq_40772692/article/details/80183248


四、喜水青蛙

总是喜欢在水里嬉戏的青蛙, 某天要过河拜访一位朋友。已知河道中长满了带刺的不知名生物, 能通过的路只有一条直线, 长度为L。直线上随机分布着m块石头。 青蛙的最小跳跃距离是s, 最大跳跃距离是t。青蛙想要尽可能的少踩石头, 那么它通过河道最少会踩到多少石头?

输入描述:

多组数据输入,其中每组数据:
第一行输入1个整数L(1<=L<=1e9)。
第二行输入3个整数:s、t、m(1<=s<=t<=10,1<=m<=100)。
第三行输入m个不同的整数,表示m个石子在数轴上的分布位置。
每行所有相邻整数用空格隔开。

输出描述:

输出青蛙过河最少会踩到的石子数量,
每组输入数据对应的输出结果单独成行。

输入样例:

10
2 3 5
2 3 5 6 7

输出样例:

2


以下代码来自:
https://bbs.csdn.net/topics/607060820https://bbs.csdn.net/topics/607060820

#include 
#include 
#include 
void solution(int L, int ar[], int arr[]);
void move(int s, int count, int L,  int ar[],  int arr[]);
int res=INT_MAX;
int main(){int L;int ar[3];int *arr;scanf("%d",&L);for(int i=0;i<3;i++){scanf("%d",&ar[i]);}arr=malloc(sizeof(int)*ar[2]);for(int i=0;icount){res=count;}}
}

相关内容

热门资讯

苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...