于妍蓝桥杯题目训练第二天

于妍 2022-01-24 12:27:58
问题描述
  给定两个字符串,寻找这两个字串之间的最长公共子序列。
输入格式
  输入两行,分别包含一个字符串,仅含有小写字母。
输出格式
  最长公共子序列的长度。
样例输入
abcdgh
aedfhb
样例输出
3
样例说明
  最长公共子序列为a,d,h。
数据规模和约定
  字串长度1~1000。
str1=input()
str2=input()
arr=[[0 for i in range(len(str1)+1)] for i in range(len(str2)+ 1)]

for i in range(len(str2)+1):
    for j in range(len(str1)+1):
        if j==0 or i==0:
            arr[i][j]=0
        elif i>0 and j>0 and str1[j-1]==str2[i-1]: # 如果元素相等,就加1
            arr[i][j]=arr[i-1][j-1]+1
        else:
            arr[i][j]=max(arr[i-1][j],arr[i][j-1])  # 取这个位置相邻的左边与上边的最大值
print(arr[-1][-1])

为了吸引更多的顾客,某商场决定推行有奖抽彩活动。“本商场每日将产生一名幸运顾客,凡购买30元以上商品者均有机会获得本商场提供的一份精美礼品。”该商场的幸运顾客产生方式十分奇特:每位顾客可至抽奖台抽取一个幸运号码,该商场在抽奖活动推出的第i天将从所有顾客中(包括不在本日购物满30元者)挑出幸运号第i小的顾客作为当日的幸运顾客。该商场的商品本就价廉物美,自从有奖活动推出后,顾客更是络绎不绝,因此急需你编写一个程序,为他解决幸运顾客的产生问题。

【输入数据】
  第1行一个整数N,表示命令数。
  第2~N+1行,每行一个数,表示命令。如果x>=0,表示有一顾客抽取了号码x;如果x=-1,表示傍晚抽取该日的幸运号码。
【输出数据】
  对应各命令-1输出幸运号码;每行一个号码。(两个相同的幸运号看作两个号码)
样例输入
6
3
4
-1
-1
3
-1
样例输出
3
4
4
解释
  只关注获奖的号码是多少,每个号码可以获奖多次。
数据规模及约定
  共10组数据。
  对100%的数据,N=10^6所有命令为-1或int范围内的非负数,前i的命令中-1的数量不超过[i/2](向下取整)。

n=int(input())
lis=[]
cout=0
result=[]
for i in range(n):
    a=int(input())
    #判断是否需要重新排序
    if a==-1:
        cout+=1  # 输出第i小的标记
        lis.sort()
        result.append(lis) # 以列表的形式存放于列表里

    else:
        lis.append(a)
for cout in range(len(result)):
    print(result[cout][cout])

问题描述
  小袁非常喜欢滑雪, 因为滑雪很刺激。为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。 小袁想知道在某个区域中最长的一个滑坡。区域由一个二维数组给出。数组的每个数字代表点的高度。如下:

 


一个人可以从某个点滑向上下左右相邻四个点之一,当且仅当高度减小。在上面的例子中,一条可滑行的滑坡为24-17-16-1。当然25-24-23-…-3-2-1更长。事实上,这是最长的一条。
  你的任务就是找到最长的一条滑坡,并且将滑坡的长度输出。 滑坡的长度定义为经过点的个数,例如滑坡24-17-16-1的长度是4。
输入格式
  输入的第一行表示区域的行数R和列数C(1<=R, C<=10)。下面是R行,每行有C个整数,依次是每个点的高度h(0<= h <=10000)。
输出格式
  只有一行,为一个整数,即最长区域的长度。
样例输入
5 5
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
样例输出
25

 

def dfs(x, y):
    max_height = 1
    if dp[x][y] > 0:
        return dp[x][y]
    for k in range(4):
        tx = x + next_[k][0]
        ty = y + next_[k][1]
        if tx < 0 or tx >= row or ty < 0 or ty >= col:  # 判断是否超出界限
            continue
        if arr[tx][ty] >= arr[x][y]:  # 判断高度是否符合要求
            continue
        max_height = max(max_height, dfs(tx, ty) + 1)  # 取四个方向的最大值

    dp[x][y] = max_height
    return dp[x][y]
m,n = map(int,input().split())
sum=0
dp=[[0 for i in range(m)] for i in  range(n)]
arr=[list(map(int,input().split())) for i in range(m)]
next_ = [[0, 1], [1,0], [0,-1], [-1, 0]]   # 移动方向

for i in range(m):
    for j in range(n):
        sum = max(sum, dfs(i, j))

print(sum)


 

...全文
67 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

30,336

社区成员

发帖
与我相关
我的任务
社区描述
打造最热爱学习的高校社区,帮助大家提升计算机领域知识,带大家打比赛拿奖,提高自我,希望大家共同创造良好的社区氛围。
社区管理员
  • 川川菜鸟
  • 亡心灵
  • 星辰菜鸟
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

监督大家学习,每日学习打卡,以投稿形式打卡。扫码关注公众号,可加入粉丝群和领取大量资源。

试试用AI创作助手写篇文章吧