10.30周赛

1030周赛

这次周三完成了三道题目,排名为11/313,算是小有进步
说明:解法不一定是最佳,都是笔者在限定时间内写出来的。

题目

代写匿名信

'''
小Q想要匿名举报XX领导不务正业! 小Q害怕别人认出他的字迹。 他选择从报纸上剪裁下来英文字母组成自己的举报信。
现在小Q找来了报纸,和自己的举报信的Txt, 你能帮他确定一下是否能够完成匿名信吗?
'''
思路

遍历即可,但要注意举报信在报纸中不一定是连续存放的。

代码实现
class Solution:
    def __init__(self) -> None:
        pass
    def solution(self, words, msg):
        count = 0
        for i in msg:
            if i in words:
                count += 1
        if count == len(msg):
            result = 'Yes'
        else:
            result = 'No'
        return result

if __name__ == "__main__":
    words = input().strip()
    msg = input().strip()
    sol = Solution()
    result = sol.solution(words, msg)
    print(result)

在这里插入图片描述

小艺改编字符串

'''
已知字符串str. 添加至少多少字符可以使得str变成回文串。
'''
思路

这题是一个动态规划问题,其实难度个人感觉要高于第三题,但不知道为什么放在了第二题。
既然要求加的位数,我们则要使用逆向思维,不用加的位数,如果求出了不用加的位数,用总的长度-不用加的的位数就是要加的位数了。
那么问题来了,怎么求不用加的位数,如果不用加,则说明倒过来以后已经成为了一个回文数。因此我们可以将原序列倒过来,求倒过来的与原序列的最长公共子序列的长度。关于如何求最长公共子序列的问题,笔者在之前的一篇文章中就已经提过了,在这里就不赘述了,大家有兴趣可以去看看,链接附上:
添加链接描述

代码实现
class Solution:
    def __init__(self) -> None:
        pass
    def solution(self, s):
        result = None
        dp = [[0 for i in range(1100)] for j in range(1100)]
        l = len(s)
        s2 = list(s)
        s2.reverse()

        for i in range(l):
            for j in range(l):
                if s[i] == s2[j]:
                    dp[i+1][j+1] = dp[i][j] + 1
                else:
                    dp[i+1][j+1] = max(dp[i][j+1],dp[i+1][j])

        result = l - dp[l][l]
        return result

if __name__ == "__main__":
    s = input().strip()
    sol = Solution()
    result = sol.solution(s)
    print(result)

在这里插入图片描述

开学趣闻之美食诱惑

'''
小艺酱又开学了,可是在上学的路上总会有各种意想不到的美食诱惑让小艺酱迟到。 假设小艺酱家到学校是一个n*n的矩
阵。 每个格子包含一个诱惑值p,诱惑着小艺,让她迟到。 小艺位于矩阵的左上角,学校在矩阵的右下角落。 小艺想知道
自己到达学校所要经历的最小诱惑值是?
'''
思路

这题其实就是求一个矩阵从左上角到右下角最短路径的问题。
我们不难发现,除去第一行与第一列以外,其余的格子均可以看成是从上方或者左方的格子走过来的,因此每次我们只要比较上方与左方格子数字的大小,选择走较小的格子来。
第一行与第一列进行累加即可。

代码实现
class Solution:
    def __init__(self) -> None:
        pass
    def solution(self, n, vector):
        result = None
        data = [[0 for i in range(n)] for j in range(n)]
        data[0][0] = vector[0][0]

        for i in range(1,n):
            data[i][0] = data[i-1][0] + vector[i][0]
            data[0][i] = data[0][i-1] + vector[0][i]
        for i in range(1,n):
            for j in range(1,n):
                if data[i][j-1] > data[i-1][j]:
                    data[i][j] = data[i-1][j] + vector[i][j]
                else:
                    data[i][j] = data[i][j-1] + vector[i][j]

        result = data[n-1][n-1]

        return result
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)

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值