算法提升。

最长滑雪道(图搜索,递归)

在这里插入图片描述
在这里插入图片描述


r,c=map(int,input().split())
ma=[[] for i in range(r)]     #存放每个点高度
for i in range(r):
    arr=list(map(int,input().split()))
    for j in range(c):
        ma[i].append(arr[j])        ##输入高度
dp=[[0 for i in range(c)] for j in range(r)]
#存放每个点开始的最大长度
nex=[[0,1],[1,0],[0,-1],[-1,0]]
#用来控制上下左右
ans=0

def dfs(x,y):     #求每个点开始的最大长度函数
    l=1
    if dp[x][y]>0:
        return dp[x][y]    #递归结束,走到了重复点
    for i in range(4):
        tx=x+nex[i][0]
        ty=y+nex[i][1]
        if tx<0 or ty<0 or tx>=r or ty>=c:
            continue
        if ma[tx][ty]>=ma[x][y]:  #只能向低的方向走
            continue
        l=max(l,dfs(tx,ty)+1)
        #用来寻找哪个方向走能让长度最大
    dp[x][y]=l
    return dp[x][y]    #返回x,y开始的最大长度

for i in range(r):        #找从哪个点开始长度最大
    for j in range(c):
        ans=max(ans,dfs(i,j))
print(ans)

K好数(动态规划)

在这里插入图片描述

k,l=map(int,input().split())
dp=[[0 for i in range(k)] for i in range(l)]
def count(L,K,ans):
    for i in range(K):
        dp[0][i]=1    #初始化一位数
    for i in range(1,L):
        for j in range(K):
            for p in range(K):
                if abs(j-p)!=1:
                    dp[i][j]+=dp[i-1][p]
    for j in range(1,K):
        #输出个数时,记得020这种0在首位的不能算
        ans+=dp[L-1][j]
        ans%=1000000007
    return ans

ans=0
if k==1 and l==1:   ##一位一进制,一进制不存在
    print(0)
elif k!=1 and l==1:  #一位k进制数
    print(k)
else:
    ans=count(l,k,ans)
    print(ans)

石子游戏(贪心)

在这里插入图片描述
在这里插入图片描述

n=int(input())
s=[0 for i in range(n)]
for i in range(n):   #注意输入是一行一个
    s[i]=int(input())
c=0
while len(s)>1:
    s.sort()
    c+=(s[-1]+1)*(s[-2]+1)
    m=s[-1]+s[-2]
    s.pop()
    s.pop()
    s.append(m)
print(c)

注意pop()使用方法

幸运顾客(堆【输出第i小的元素】)

![](https://img-blog.csdnimg.cn/cabdf66e0e2e47908c3f8c99b76d5bae.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAcXFfNDA4MzIwMzQ=,size_20,color_FFFFFF,t_70,g_se,x_16

n=int(input())
s=[]
x=[]
ii=0
for i in range(n):
    data =int(input())
    if data!=-1:
        s.append(data)
    else:
        s.sort()
        x.append(s[ii])
        ii+=1
for i in range(len(x)):
    print(x[i])

最长公共子序列(动态规划)

在这里插入图片描述
分析:
在这里插入图片描述

string1=input()
string2=input()
arr=[[ 0 for i in range(len(string1)+1)] for i in range(len(string2)+1)]
#arr[i][j]表示str1的前i个长度和str2的前j个长度中的公共子序列
def L(str1,str2):
    for i in range(len(str1)+1):
        for j in range(len(str2)+1):
            if i==0 or j==0:
                arr[i][j]=0
            elif i>0 and j>0 and str1[i-1]==str2[j-1]:
                arr[i][j]=arr[i-1][j-1]+1
            else:
                arr[i][j]=max(arr[i-1][j],arr[i][j-1])
    return arr[len(str1)][len(str2)]
print(L(string1,string2))

复数求和

在这里插入图片描述

n=int(input())
s=[[] for i in range(n)]  ##
a=0
b=0
for i in range (n):
    arr=input().split()
    for j in range (2):
        s[i].append(arr[j])
        ##注意append需要该位置之前没有值,也就是不能初始化0
for i in range(n):
    a+=int(s[i][0])
    b+=int(s[i][1])
print(a,'+',b,'i',sep='')

成绩排名(结构体)

在这里插入图片描述

n=int(input())
inf=[tuple(input().split()) for i in range(n)]
inf.sort(key=lambda d: d[0])
inf.sort(key=lambda d: int(d[1]), reverse=True)
for i in range(n):
    print(inf[i][0])

==inf=[tuple(input().split()) for i in range(n)]==列表中的元组
sort(key=lambda d: d[0])

递归倒置字符数组

在这里插入图片描述

n,s=input().split()
l=len(s)
if l==1:
    print(s)
s=list(s)   #字符串转列表

def rev(s,m,n):
    if m>=n:
        return s
    else:
        temp=s[m]
        s[m]=s[n]
        s[n]=temp
        for i in range(l):
            print(s[i],end='')
        print()
        rev(s,m+1,n-1)
rev(s,0,l-1)

字符串不能单独操作,需要转列表
可以用循环,递归容易出错。此题为自己写的,没有系统验证。

字符串跳步(字符串)

在这里插入图片描述

s=input()
#不能写list(input().split())或者input().split(),那是['   '],不能转为列表
l=len(s)
m,n=map(int,input().split())
s=list(s)
for i in range(m,l,n):  #(start,end,skip)
    print(s[i],end='')

最长字符序列(DP)

在这里插入图片描述

string1,string2=input().split()
def L(str1,str2):
    arr=[[0 for i in range(len(str2)+1)] for j in range(len(str1)+1)]
    ##这里注意先str2,再str1,否则会越界
    for i in range(len(str1)+1):
        for j in range(len(str2)+1):
            if i==0 or j==0:
                arr[i][j]=0
            elif i>0 and j>0 and str1[i-1]==str2[j-1]:
                arr[i][j]=arr[i-1][j-1]+1
            elif i>0 and j>0 and str1[i-1]!=str2[j-1]:
                arr[i][j]=max(arr[i-1][j],arr[i][j-1])
    return arr[len(str1)][len(str2)]
print(L(string1,string2))

队列操作(队列)

在这里插入图片描述

n=int(input())
arr=[]
for i in range(n):
    m=list(map(int,input().split()))   
    ##有一行要输入两个的
    if m[0]==1:
        arr.append(m[1])
    if m[0]==2 :      
        #m是个列表,就算只有一个数,也不能用m==2判断
        if len(arr)!=0:
            c=arr[0]
            print(c)
            arr.pop(0)
        else:
            print('no')
    if m[0]==3:
        print(len(arr))

队列操作

在这里插入图片描述

N = int(input())

queue = []

for _ in range(N):
    command = list(map(int, input().split()))
    if command[0] == 1:
        queue.append(command[1])
    elif command[0] == 2:
        if len(queue) == 0:
            print('no')
            break   #出队时候如果出现下溢需要退出,没有这句就扣40分
        else:
            print(queue[0])
            queue.pop(0)
    else:
        print(len(queue))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值