CSDN竞赛第31期

文章介绍了三道编程题的解决方案,分别是通过两层循环寻找数组中的最大利润,使用动态规划求解矩阵中最短路径,以及计算字符串中心的最长回文子串长度。代码均用Python实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.第一题找最优利润值,很简单直接两层循环暴力即可

class Solution:
    def __init__(self) -> None:
        pass
    def solution(self, values):
        result = 0
        for i in range(0,len(values)):
            for j in range(i+1,len(values)):
                result=max(values[j]-values[i],result)
        return result
if __name__ == "__main__":
    values = [int(item) for item in input().strip().split()]
    sol = Solution()
    result = sol.solution(values)
    print(result)

2.第二题开学趣闻之美食诱惑是一个动态规划问题,相当于是给定一个包含非负整数的 n * n 网格,然后从左上角到右下角找到一条路径,使得路径上的权值总和为最小。
题目要求是从左上角到右下角,最小路径和是多少,因此定义 dp[i] [j]的含义为:当小艺酱从左上角走到(i, j) 这个位置时,当前的最小路径和是 dp[i] [j]。要到达(i,j),有两种方式:
一种是从 (i-1, j) 这个位置走一步到达
一种是从(i, j - 1) 这个位置走一步到达
因此状态转移方程为:
dp[i][j] = min(dp[i-1][j],dp[i][j-1]) + vector[i][j]
(vector[i][j] 表示当前网格中权值)

class Solution:
    def __init__(self) -> None:
        pass
    def solution(self, n, vector):
        result = None
        dp = [[0 for i in range(n)] for j in range(n)]
        dp[0][0]=vector[0][0]
        for i in range(1,n):
            dp[0][i] = dp[0][i-1]+vector[0][i]
            dp[i][0] = dp[i-1][0]+vector[i][0]
        for i in range(1,n):
            for j in range(1,n):
                dp[i][j] = min(dp[i-1][j],dp[i][j-1]) + vector[i][j]
        return dp[-1][-1]
if __name__ == "__main__":
    n = int(input().strip())
    vector = []
    for i in range(n):
        vector.append([int(item) for item in input().strip().split()])
    sol = Solution()
    result = sol.solution(n, vector)
    print(result)

3.用lst列表来记录每个位置为中心向两边扩展的回文长度。由于奇数和偶数情况不同,因此要分两种情况判断。

class Solution:
    def __init__(self) -> None:
        pass
    def solution(self, s):
        lst=[];j=0 
        for i in range(len(s)): 
            dt = min(i+1,len(s)-i)
            flag=False
            for j in range(dt):
                if s[i+j] != s[i-j]:
                    lst.append((j-1)*2+1)
                    flag=True
                    break
            if not flag:
                lst.append(j*2+1)
        for i in range(len(s)): 
            dt = min(i+1,len(s)-i+1)
            flag=False
            for j in range(dt):
                if s[i+j-1] != s[i-j]:
                    lst.append((j-1)*2)
                    flag=True
                    break
            if not flag:lst.append(j*2)
        return max(lst)
 
if __name__ == "__main__":
    s = input().strip()
    s1 = Solution()
    result = s1.solution(s)
    print(result)

4.第四题感觉有点奇怪,样例过了但是其他点一直不对

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白驹_过隙

听说打赏的都进了福布斯排行榜

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值