戳气球
上交今年机试的第二题,一道区间dp
可是我还是不会做啊, 啊啊啊啊啊 ,稍微有点变形,日了狗了,蓝桥杯省赛之后我要把力扣的dp刷穿
class Solution:
def maxCoins(self, nums: List[int]) -> int:
nums=[1]+nums+[1]
n=len(nums)
dp=[[0 for i in range(n)]for j in range(n)]
for k in range(2,n):
for i in range(n):
l=i
r=i+k
if r>=n:
break
for j in range(l+1,r):
dp[l][r]=max(dp[l][r],dp[l][j]+dp[j][r]+nums[l]*nums[j]*nums[r])
return dp[0][n-1]
矩阵距离 (多源BFS)
所谓多源bfs就是把终点当做起点来进行宽搜,第一个到达某个起点的就是最短路
def bfs():
dx=[1,-1,0,0]
dy=[0,0,1,-1]
from collections import deque
vis = [[False for i in range(m)] for j in range(n)]
q=deque([])
for i in range(n):
for j in range(m):
if adj[i][j]==1:
q.append((i,j))
vis[i][j]=1
adj[i][j]=0
num=0
while q:
size=len(q)
num+=1
for i in range(size):
top=q.popleft()
for i in range(4):
nx=top[0]+dx[i]
ny=top[1]+dy[i]
if isvalid(nx,ny) and not vis[nx][ny]:
vis[nx][ny]=True
adj[nx][ny]=num
q.append((nx,ny))
for i in adj:
for j in i:
print(j,end=" ")
print()
return
def isvalid(x,y):
if x<0 or x>=n:
return False
if y<0 or y>=m:
return False
return True
n,m=map(int,input().split())
adj=[]
for i in range(n):
adj.append(list(map(int,list(input()))))
bfs()
魔板
这一题的输入数据太恶心人了
def opa(x):
return x[4:]+x[:4]
def opb(x):
return [x[3]]+x[:3]+[x[7]]+x[4:7]
def opc(x):
return [x[0],x[5],x[1],x[3],x[4],x[6],x[2],x[7]]
def bfs():
from collections import deque
q=deque([])
everuse=[]
q.append(start)
everuse.append(start)
ans=0
while q:
size=len(q)
for i in range(size):
top=q.popleft()
if top==end:
print(ans)
return
a=opa(top)
if a not in everuse:
q.append(a)
everuse.append(a)
b=opb(top)
if b not in everuse:
q.append(b)
everuse.append(b)
c=opc(top)
if c not in everuse:
q.append(c)
everuse.append(c)
ans+=1
return
start=[1,2,3,4,8,7,6,5]
end=list(map(int,input().split()))
end=end[:4]+end[4:][::-1]
bfs()