目录
1.291. 蒙德里安的梦想 - AcWing题库
while True:
n,m=map(int,input().split())
if n==0 and m==0:
break
dp=[[0 for i in range(1<<n)]for j in range(m+1)]
dp[0][0]=1
st=[True for i in range(1<<n)]
for i in range(1<<n):
cnt=0
for k in range(n):
if i>>k&1:
if cnt%2==1:
st[i]=False
cnt=0
else:
cnt+=1
if cnt%2==1:
st[i]=False
for i in range(1,m+1):
for j in range(1<<n):
for k in range(1<<n):
if j&k==0 and st[j|k]:
dp[i][j]+=dp[i-1][k]
print(dp[m][0])
2.91. 最短Hamilton路径 - AcWing题库
(1)DFS(时间爆了)
时间爆了
n=int(input())
adj=[]
vis=[False for i in range(n)]
ans=1<<31
def dfs(cur,length):
global ans
if vis.count(False)==0:
if cur==n-1:
ans=min(ans,length)
return
for i in range(n):
if adj[cur][i]!=0 and not vis[i]:
vis[i]=True
dfs(i,length+adj[cur][i])
vis[i]=False
return
for i in range(n):
adj.append(list(map(int,input().split())))
vis[0]=True
dfs(0,0)
print(ans)
(2)状压DP
n=int(input())
adj=[]
for i in range(n):
adj.append(list(map(int,input().split())))
dp=[[1<<31 for i in range(n)]for j in range(1<<n)]
dp[1][0]=0
for i in range(1<<n):
for j in range(n):
if i>>j&1:
for k in range(n):
if (i-(1<<j))>>k&1:
dp[i][j]=min(dp[i][j],adj[k][j]+dp[i-(1<<j)][k])
print(dp[(1<<n)-1][n-1])
3.285. 没有上司的舞会 - AcWing题库
(1)DFS
def dfs(cur):
##返回(a,b)a为不选当前节点,b为先当前节点
chcur,notcur=a[cur],0
for i in adj[cur]:
x,y=dfs(i)
chcur+=x
notcur+=max(x,y)
return (notcur,chcur)
n=int(input())
a=[0]
for i in range(n):
a.append(int(input())),
adj=[[]for i in range(n+1)]
hashtable=[0 for i in range(n+1)]
for i in range(n-1):
l,k=map(int,input().split())
hashtable[l]=1
adj[k].append(l)
head=hashtable[1:].index(0)+1
print(max(dfs(head)))
4.901. 滑雪 - AcWing题库
dx=[-1,0,+1,0]
dy=[0,+1,0,-1]
def dfs(x,y):
maxlength=1
if dp[x][y]!=-1:
return dp[x][y]
for i in range(4):
nx,ny=x+dx[i],y+dy[i]
if nx>=0 and nx<r and ny>=0 and ny<c and adj[nx][ny]<adj[x][y]:
maxlength=max(maxlength,dfs(nx,ny)+1)
dp[x][y]=maxlength
return maxlength
r,c=map(int,input().split())
adj=[]
for i in range(r):
adj.append(list(map(int,input().split())))
ans=0
dp=[[-1 for i in range(c)]for j in range(r)]
for i in range(r):
for j in range(c):
ans=max(ans,dfs(i,j))
print(ans)
5.蓝桥杯——卡片
# 2021041820210418
import math
n=int(input())
y=set()
for i in range(1,int(math.sqrt(n))+1):
if n%i==0:
y.add(i)
y.add(n//i)
y=list(y)
y.sort()
ans=0
for i in y:
for j in y:
if n//(i*j) in y and n%(i*j)==0:
ans+=1
print(ans)