码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【CSDN 竞赛—第10期】所有题目解法的思考和总结


    目录

    一、 熊孩子拜访

    二、 走楼梯

    三、括号上色

    四、喜水青蛙


    一、 熊孩子拜访

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

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

    1. class Solution:
    2. def __init__(self) -> None:
    3. pass
    4. def solution(self, n, arr):
    5. result = []
    6. # 保存右值
    7. max = 0
    8. # 保存左值
    9. min = 0
    10. next = 0
    11. for item in arr:
    12. if next>item and item>max:
    13. max=next
    14. min=item
    15. elif next<min and item>max:
    16. min=next
    17. next=item
    18. result.append(str(min))
    19. result.append(str(max))
    20. if len(result)==0:
    21. result=["0","0"]
    22. return result
    23. if __name__ == "__main__":
    24. n = int(input().strip())
    25. arr = [int(item) for item in input().strip().split()]
    26. sol = Solution()
    27. result = sol.solution(n, arr)
    28. print(" ".join(result))

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

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

    例如:

     

     


    二、 走楼梯

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

    我的解题思路:

    1. class Solution:
    2. def __init__(self) -> None:
    3. pass
    4. def solution(self, n):
    5. if isinstance(n, int) and n > 0:
    6. basic_dic = {1: 1, 2: 2}
    7. if n in basic_dic.keys():
    8. return basic_dic[n]
    9. else:
    10. return self.solution(n - 1) + self.solution(n - 2)
    11. else:
    12. return False
    13. if __name__ == "__main__":
    14. n = int(input().strip())
    15. sol = Solution()
    16. result = sol.solution(5)
    17. print(result)

    输入和输出: 


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

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

    1. def solution(n):
    2. if isinstance(n,int) and n > 0:
    3. # 如果台阶数总共有3个,那么有4种走法:
    4. # 1 1 1
    5. # 1 2
    6. # 2 1
    7. # 3
    8. # 如果n为4,有7种走法
    9. # 1 3
    10. # 3 1
    11. # 22
    12. # 1111
    13. # 211
    14. # 121
    15. # 112
    16. # 有4级台阶
    17. # temp=1,h1=2,h2=4,h3=1+2+4,返回7
    18. # 有5级台阶
    19. # temp=1,h1=2,h2=4,h3=1+2+4
    20. # temp=2,h1=4,h2=1+2+4,h3=2+4+1+2+4,返回13
    21. h1,h2,h3 = 1,2,4
    22. basic_dic = {1:1,2:2,3:4}
    23. if stairs in basic_dic.keys():
    24. return basic_dic[n]
    25. else:
    26. while n>=4:
    27. temp = h1
    28. h1 = h2
    29. h2 = h3
    30. h3 = temp + h1 + h2
    31. n-=1
    32. return h3
    33. else:
    34. return False
    35. # 总结:
    36. # 如果一次可以走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

    1. import sys
    2. s = input()
    3. num = strlen = len(s)
    4. tmp = [0 for i in range(num)] # 记录左括号的位置
    5. match = [0 for i in range(num)] # 记录右匹配的位置
    6. dp = [[[[0 for i in range(3)] for i in range(3)] for i in range(num)] for i in range(num)]
    7. # 由内向外建立多维dp 数组的形式
    8. # dp=np.arange(3*3*num*num).reshape(num,num,3,3)
    9. # 0代表不上色,1代表上红色,2代表上蓝色
    10. mod = 1000000007
    11. def getmatch(len):
    12. p = 0
    13. for i in range(len):
    14. if (s[i] == '('):
    15. tmp[p] = i
    16. p = p + 1
    17. else:
    18. match[i] = tmp[p - 1]
    19. match[tmp[p - 1]] = i
    20. p = p - 1
    21. def dfs(l, r):
    22. if (l + 1 == r): # 边界条件
    23. dp[l][r][0][1] = 1
    24. dp[l][r][1][0] = 1
    25. dp[l][r][0][2] = 1
    26. dp[l][r][2][0] = 1
    27. return
    28. if (match[l] == r): # 如果匹配的话方案数相加
    29. dfs(l + 1, r - 1)
    30. for i in range(3):
    31. for j in range(3):
    32. if (j != 1):
    33. dp[l][r][0][1] = (dp[l][r][0][1] + dp[l + 1][r - 1][i][j]) % mod;
    34. if (i != 1):
    35. dp[l][r][1][0] = (dp[l][r][1][0] + dp[l + 1][r - 1][i][j]) % mod;
    36. if (j != 2):
    37. dp[l][r][0][2] = (dp[l][r][0][2] + dp[l + 1][r - 1][i][j]) % mod;
    38. if (i != 2):
    39. dp[l][r][2][0] = (dp[l][r][2][0] + dp[l + 1][r - 1][i][j]) % mod;
    40. return
    41. else: # 否则方案数相乘,乘法原理
    42. p = match[l]
    43. dfs(l, p)
    44. dfs(p + 1, r)
    45. for i in range(3):
    46. for j in range(3):
    47. for k in range(3):
    48. for q in range(3):
    49. if not ((k == 1 and q == 1) or (k == 2 and q == 2)):
    50. dp[l][r][i][j] = (dp[l][r][i][j] + (dp[l][p][i][k] * dp[p + 1][r][q][j]) % mod) % mod
    51. if __name__ == '__main__':
    52. getmatch(strlen)
    53. dfs(0, strlen - 1)
    54. ans = 0
    55. for i in range(3):
    56. for j in range(3):
    57. ans = (ans + dp[0][strlen - 1][i][j]) % mod;
    58. 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

    1. #include
    2. #include
    3. #include
    4. void solution(int L, int ar[], int arr[]);
    5. void move(int s, int count, int L, int ar[], int arr[]);
    6. int res=INT_MAX;
    7. int main(){
    8. int L;
    9. int ar[3];
    10. int *arr;
    11. scanf("%d",&L);
    12. for(int i=0;i<3;i++){
    13. scanf("%d",&ar[i]);
    14. }
    15. arr=malloc(sizeof(int)*ar[2]);
    16. for(int i=0;i2];i++){
    17. scanf("%d",&arr[i]);
    18. }
    19. solution(L,ar,arr);
    20. printf("%d",res);
    21. }
    22. void solution(int L, int ar[], int arr[]){
    23. int s=0;
    24. int count=0;
    25. move(s, count, L, ar, arr);
    26. }
    27. void move(int s, int count, int L, int ar[],int arr[]){
    28. if(s
    29. for(int i=0;i2];i++){
    30. if(s==arr[i]){
    31. count++;
    32. }
    33. }
    34. for(int j=ar[0];j<=ar[1];j++){
    35. move(s+j,count,L,ar,arr);
    36. }
    37. // move(s+ar[0],count,L,ar,arr);
    38. // move(s+ar[1],count,L,ar,arr);
    39. }else{
    40. if(res>count){
    41. res=count;
    42. }
    43. }
    44. }
  • 相关阅读:
    java毕业设计高校毕业生就业管理系统mybatis+源码+调试部署+系统+数据库+lw
    浅谈Serverless之uniCloud
    【LeetCode】19. 删除链表的倒数第 N 个结点
    最基本的25道深度学习面试问题和答案
    2022世界人工智能大会开幕,天翼云注智城市数字化转型
    基于QT的学生考勤系统
    dpdk trace 模块原理分析
    从C语言到C++_40(多线程相关)C++线程接口+线程安全问题加锁(shared_ptr+STL+单例)
    关于model 需要定义 $fillable
    衡兰芷若成绝响,人间不见周海媚(4k修复基于PaddleGan)
  • 原文地址:https://blog.csdn.net/qq_40506723/article/details/127950026
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号