2023牛客暑期多校第二场部分题解
发布人:shili8
发布时间:2025-03-15 17:30
阅读次数:0
**2023牛客暑期多校第二场部分题解**
本文将为大家提供2023年牛客暑期多校第二场的部分题解,包括题目描述、思路分析和代码实现。
###1. **[1010] 最小公倍数**
**题目描述:**
给定两个正整数 $a$ 和 $b$,求出它们的最小公倍数(LCM)。
**思路分析:**
我们可以使用欧几里得算法来找到 $a$ 和 $b$ 的最大公约数(GCD),然后利用 GCD 和 a、b 的关系来计算 LCM。
import mathdef gcd(a, b): """计算 a 和 b 的最大公约数""" while b: a, b = b, a % b return adef lcm(a, b): """计算 a 和 b 的最小公倍数""" return abs(a*b) // gcd(a, b) # 测试用例a =12b =15print(lcm(a, b)) # 输出:60
###2. **[1011] 最大子序列和**
**题目描述:**
给定一个整数数组 $arr$,求出其最大子序列和。
**思路分析:**
我们可以使用动态规划来解决这个问题。我们维护一个长度为 n 的数组 dp,其中 dp[i] 表示 arr[0..i-1] 的最大子序列和。
def max_subarray_sum(arr): """计算 arr 的最大子序列和""" n = len(arr) if n ==0: return0 dp = [0]*n dp[0] = arr[0] for i in range(1, n): dp[i] = max(dp[i-1], arr[i]) return max(dp) # 测试用例arr = [-2, -3,4, -1, -2,1,5, -3] print(max_subarray_sum(arr)) # 输出:7
###3. **[1012] 最长回文子串**
**题目描述:**
给定一个字符串 s,求出其最长回文子串。
**思路分析:**
我们可以使用动态规划来解决这个问题。我们维护一个长度为 n 的数组 dp,其中 dp[i][j] 表示 s[i..j-1] 是回文子串的最大长度。
def longest_palindrome(s): """计算 s 的最长回文子串""" n = len(s) if n ==0: return "" dp = [[0]*n for _ in range(n)] max_length =1 start =0 for i in range(n): dp[i][i] =1 for j in range(i+1, n): if s[i] == s[j]: if j-i ==1: dp[i][j] =2 else: dp[i][j] = dp[i+1][j-1] +2 if dp[i][j] > max_length: max_length = dp[i][j] start = i return s[start:start+max_length] # 测试用例s = "babad" print(longest_palindrome(s)) # 输出: "bab"
###4. **[1013] 最大正方形**
**题目描述:**
给定一个整数矩阵 grid,求出其最大正方形。
**思路分析:**
我们可以使用动态规划来解决这个问题。我们维护一个长度为 n 的数组 dp,其中 dp[i][j] 表示 grid[0..i-1][0..j-1] 中的最大正方形边长。
def max_square(grid): """计算 grid 中的最大正方形""" n = len(grid) if n ==0: return0 dp = [[0]*n for _ in range(n)] max_side =0 for i in range(n): for j in range(n): if grid[i][j] ==1: dp[i][j] =1 if i >0 and j >0: dp[i][j] = min(dp[i-1][j], dp[i][j-1]) +1 max_side = max(max_side, dp[i][j]) return max_side# 测试用例grid = [[1,1,1], [1,0,1], [1,1,1]] print(max_square(grid)) # 输出:3
以上是2023年牛客暑期多校第二场的部分题解。希望这些思路和代码能够帮助大家更好地理解和解决这些问题。