最长滑雪道(图搜索,递归)
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小的元素】)
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))