刷题记录(240619)

meituan0427

第一题

小美拿到了一个字符串,她准备把其中所有的"mei"子串替换为"tuan"子串,你能帮帮她吗?

输入描述

一个仅由小写字母组成的字符串。长度不超100000

输出描述

修改后的字符串。

示例
输入

meituan

输出

tuantuan

思路
直接模拟即可

s = input().replace("mei","tuan")
print(s)

第二题

小美拿到了一个字符矩阵,她定义一个矩形区域是“特殊的”,当且仅当这个矩形区域中没有两个相同的字符。 现在小美想知道,有多少个2行2列的矩阵区域是特殊的?
输入描述
第一行输入两个正整数n,m,代表矩阵的行数和列数。
接下来的n行,每行输入一个长度为m的、仅由小写字母组成的字符串,代表小美拿到的字符矩阵。
1<=n,m<=200
输出描述
一个整数,代表"特殊的"矩形区域的数量。
示例
输入

2 3
abb
aac

输出

0

思路
直接枚举即可,利用set的性质,如果len(set)==4,那么证明这个矩阵里面没有重复字符

代码

n,m = list(map(int,input().split()))
matrix = [list(input()) for _ in range(n)]
res = 0
for i in range(n-1):
    for j in range(m-1):
        s = set()
        for x in range(2):
            for y in range(2):
                s.add(matrix[i+x][j+y])
        if len(s) == 4:
            res += 1
print(res)

第三题

小美拿到了一个数组,她每次操作可以将两个相邻元素ai合并为一个元素,合并后的元素为原来两个元素之和。小美希望最终数组的最小值不小于k。她想知道有多少种不同的合并结果?

输入描述

第一行输入两个正整数n,k,代表数组大小和数组的最大值。

第二行输入个正整数ai,代表小美拿到的数组。

1<=n,k,ai<=200

输出描述

输出一个整数,代表小美可以得到多少种不同的结果。由于结果可能很大,输出对10^9+7取模的结果。

示例 1

输入

4 4
2 3 4 5

输出

4

说明
可能得到的数组有:[5,4,5]、[9,5]、[5,9]、[14]这四种。

思路
动态规划
对于每一个数字来说,如果当前和是小于k的,那么只能选择合并;否则的话,合并和不合并都可以。
f[i,j] 考虑i往后的数字,当前和是p,组成满足条件的方案数有多少。
推导如下:
if j>=k: f[i,j] += f[i+1,j+a[i]] + f[i+1,a[i]]
else: f[i,j] = f[i+1,j+a[i]]

代码

n,k = list(map(int,input().split()))
arr = list(map(int,input().split()))
MOD = 10**9+7
dp = [[-1]*(sum(arr)+1) for _ in range(n+1)]
def dfs(i,p):
    if i == n:
        return 1 if p >= k else 0
    if dp[i][p] != -1:
        return dp[i][p]
    cnt = 0
    if p >= k:
        cnt += dfs(i+1,arr[i]) + dfs(i+1,p+arr[i])
    else:
        cnt += dfs(i+1,p+arr[i])
    cnt %= MOD
    dp[i][p] = cnt
    return dp[i][p]

print(dfs(0,0))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值