2024年春季学期《算法分析与设计》练习7

while True:
    n = int(input())
    arr = []
    for i in range(n):
        arr.append(list(map(int, input().split())))
    dp = [[0] * n for i in range(n)]
    memo = [[-1] * n for i in range(n)]
    for i in range(n):
        for j in range(i + 1):
            if memo[i][j] != -1:
                dp[i][j] = memo[i][j]
            elif i == 0:
                dp[i][j] = arr[i][j]
                memo[i][j] = dp[i][j]
            else:
                dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - 1]) + arr[i][j]
                memo[i][j] = dp[i][j]
    print(max(dp[-1]))

while True:
    n = int(input())
    arr = []
    for i in range(n):
        arr.append(list(map(int, input().split())))
    dp = [[0] * n for i in range(n)]
    for i in range(n):
        for j in range(i+1):
            if i == 0:
                dp[i][j] = arr[i][j]
            else:
                dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - 1]) + arr[i][j]
    print(max(dp[-1]))

 基础的dp

 

while True:
    n, m = map(int, input().split())
    dp = [[0] * m for i in range(n)]
    for i in range(n):
        for j in range(m):
            if i == 0 or j == 0:
                dp[i][j] = 1
            else:
                dp[i][j] = (dp[i - 1][j] + dp[i][j - 1])%int((1e9+7))
    print(dp[-1][-1])

 构造一个二维数组填表就能看出来

 

while True:
    n = input()
    if len(n)==0:
        continue
    n = int(n)
    arr = []
    for i in range(n):
        arr.append(list(map(int, input().split())))
    dp = [[0] * (2 * n - 1) for i in range(n)]
    for i in range(n):
        for j in range(2 * i + 1):
            if i == 0:
                dp[i][j] = arr[i][j]
            else:
                dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - 1], dp[i - 1][j - 2]) + arr[i][j]
    print(max(dp[-1]))

数字三角形的变形 

 

while True:
    n, m = map(int, input().split())
    arr = []
    for i in range(n):
        arr.append(list(map(int, input().split())))
    dp = [[0] * m for i in range(n)]
    for i in range(n):
        for j in range(m):
            if i == 0:
                dp[i][j] = arr[i][j]
            else:
                if j+1<m:
                    dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - 1], dp[i - 1][j + 1]) + arr[i][j]
                else:
                    dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - 1]) + arr[i][j]
    print(max(dp[-1]))

 考虑边界

 

while True:
        t = int(input())
        for _ in range(t):
            n, m = map(int, input().split())
            a = [[0] * (m + 1) for _ in range(n + 1)]
            dp = [[0] * (m + 1) for _ in range(n + 1)]
 
            for i in range(1, n + 1):
                row = list(map(int, input().split()))
                for j in range(1, m + 1):
                    a[i][j] = row[j - 1]
                    if j == 1:
                        dp[i][j] = dp[i - 1][j] + a[i][j]  
                    if i == 1:
                        dp[i][j] = dp[i][j - 1] + a[i][j]  
 
            for i in range(2, n + 1):
                for j in range(2, m + 1):
                    dp[i][j] = min(dp[i][j - 1], dp[i - 1][j]) + a[i][j]
 
            print(dp[-1][-1])

注意边界处理就行了 

while True:
    n=input()
    ans=[]
    for i in range (1,len(n)//2):
        if 'AB'*i in n:
            ans.append(i)
    print(max(ans)*2)

 可以暴力查找

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值