D19-Acwing-实现DP第三节相关代码&&&课程完结撒花~

刚刚写了一个小时的日记,自己真的很幸运了,要知道珍惜呀!!!不要给自己太大压力,享受过程!!!加油!!
今天计划先实现昨天看的dp第三节,虽然有点难,但应该问题不大;然后,复习之前的代码,下午看贪心啦~~其实希望能看完两节,加油!!!

338数位统计

鹅鹅鹅尝试看了很久的题解,发现、、看不懂。根据二八定律,我该换一个题了。

291蒙德里安的梦想

有些困难,无论是在初始化,还是状态转移,还是最后的输出,都需要再仔细研究!!!

N = 12
M =1<<N #2^N中状态

def DP(n,m):
    # 重置st&f
    st = [True]*M
    f = [[0]*M for _ in range(N)]
    
    # 预处理st,把非法状态全部列出
    for i in range(1<<n): #2^n中状态
        cnt = 0
        for j in range(n):
            # 考查第j位是不是0
            if (i>>j & 1):
                if (cnt%2):
                    # 连续0的个数为奇数,则矛盾了,则第i个状态false。
                    st[i] = False
                    # 考查下一个状态
                    break
            else:
                # 如果第i个状态的第j行是0的话cnt加1
                # cnt记录连续为0的个数
                cnt += 1
        # 如果一直是0,也计算一下连续0的个数
        if cnt%2:
            st[i] = False
    # dp
    # 竖着摆
    f[0][0] = 1
    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]):
                    f[i][j] += f[i-1][k]
    # 虽然上面算到了f[m]的第j个状态,实际上只需要第0个状态,
    # 因为f[m]应该是在摆第m+1列了。f[0]开始摆第一列的
    return f[m][0]
            
n,m = map(int, input().split())
while n|m:
    print(DP(n,m))
    n,m =map(int, input().split()

91Hamilton

这个也写不出来,得对着别人的看,但是应该基本理解了。

null = 0x3f3f3f3f
n = int(input())
weight = [list(map(int,input().split())) for _ in range(n)]
dp = [[null]*n for _ 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):
                # 这里不好理解,相当于移到j那一位,然后把j那位的1删去,相当于不走了。
                if (i - (1<<j)>>k&1):
                    dp[i][j] = min(dp[i][j],dp[i-(1<<j)][k] + weight[k][j])
# 从0走到n-1点,所有点都走了一遍
# (1<
print(dp[(1<<n)-1][n-1])

285没有上司的舞会(树形dp)

不知道哪里有问题,死循环了啊啊啊
先去吃饭,下午找bug!!!!!

N = 6010
hy = [0]*N
h,e,ne,idx = [-1]*N, [0]*N, [0]*N,0
f = [[0]*2 for _ in range(N)]
# 题中并未直接告诉我们谁是父节点,需要用这个数组去判断
# father[a]代表a有无父节点
father = [False]*N

def add(a,b):
    global idx
    idx += 1
    e[idx] = b
    ne[idx] = h[a]
    h[a] = idx
    
def dfs(u):
    f[u][1] = hy[u]
    
    i = h[u]
    while i !=-1:
        j = e[i]
        dfs(j)
        
        f[u][0] += max(f[j][0],f[j][1])
        f[u][1] += f[j][0]
        i = ne[i]

n = int(input())
# 读入职员快乐指数
for i in range(1,1+n):
    hy[i] = int(input())

for _ in range(n-1):
    a,b = map(int,input().split())
    father[a] = True
    add(b,a)
# 从1号员工开始找整棵树的父节点,也就是没有父节点的那个节点
root = 1
while father[root]:
    root +=1
    
dfs(root)
print(max(f[root][0], f[root][1]))

现在是2022年3月31日,我看完了贪心(一),看了下贪心(二),一共才1个小时,所以想跑完步把它看完。因为明天下午和晚上都有事情,所以估计没时间看了,再拖又到周末了~~现在给老师交个文件,就去跑步!今天可能刮大风,要尽快了!!!

现在是2022年3月31日,晚上19:08.今天难得晚上心情好,可能是心怀感恩叭~甚至还开启了直播!!!嘿嘿!!!算法基础课马上可以看完了,就在今晚!!!!!!
今天还听了《小狗钱钱》【小蝶推荐的】,真是本不错的书!我也要建立自己的成功日记了!!!再好好读一遍书,按照书中说的去做~

现在看贪心(二)啦~~~

啊啊啊啊啊啊啊时空复杂度也看完啦~~

除了数学常识没咋看,其他都搞定啦!!!恭喜呐~

你可能感兴趣的:(蓝桥杯2022,python,算法,leetcode)