现在是2022年3月30日早上8:08分,今天尝试了Make Time中的一些关于处理email的一些方法,对我来说可能是微信,觉得踏实了很多。最近越发感到读书的好处了!现在开始复习一下昨天学的内容。
898 数字三角形
注意边界情况的处理
N = 510
INF = -1e9
a = [[INF]*N for _ in range(N)]
f = [[INF]*N for _ in range(N)]
n = int(input())
for i in range(1,1+n):
# 处理边界情况,左边加一个INF
a[i] = [INF] + list(map(int, input().split()))
f[1][1] = a[1][1]
for i in range(2,n+1):
for j in range(1,i+1):
f[i][j] = max(f[i-1][j],f[i-1][j-1]) + a[i][j]
res = INF
for i in range(1,1+n):
res = max(res,f[n][i])
print(res)
895最长上升子序列
N = 1010
f = [1]*N
n = int(input())
a = [0] + list(map(int,input().split()))
for i in range(1,1+n):
for j in range(1,i):
if a[i]>a[j]:
f[i] = max(f[i],f[j]+1)
res = 0
for i in range(1,1+n):
res = max(res,f[i])
print(res)
897 最长公共子序列
N = 1010
f = [[0]*N for _ in range(N) ]
n,m = map(int,input().split())
a = ' ' + input()
b = ' ' + input()
for i in range(1,1+n):
for j in range(1,m+1):
f[i][j] = max(f[i-1][j],f[i][j-1])
if a[i]==b[j]:
f[i][j] = max(f[i][j], f[i-1][j-1]+1)
print(f[n][m])
282石子合并
N = 310
f = [[0]*N for _ in range(N)]
s = [0]*N
n = int(input())
a = [0] + list(map(int,input().split()))
for i in range(1,1+n):
s[i] = s[i-1] + a[i]
for len in range(2,1+n):
i = 1
while i+len-1<=n:
l =i
r = i+len-1
f[l][r] = 1e9
# k=l时相当于切分左1,而不是不切分左侧;K=r-1相当于切分了右1.
for k in range(l,r):
f[l][r] = min(f[l][r],f[l][k]+f[k+1][r] + s[r]-s[l-1])
i += 1
print(f[1][n])