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)