第三十七天 高级DP

目录

1.291. 蒙德里安的梦想 - AcWing题库

2.91. 最短Hamilton路径 - AcWing题库

(1)DFS(时间爆了)

(2)状压DP

3.285. 没有上司的舞会 - AcWing题库

(1)DFS

4.901. 滑雪 - AcWing题库

5.蓝桥杯——卡片


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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值