求解矩阵最小路径和问题。给定一个m行n列的矩阵,从左上角开始每次只能向右或者向下移动,最后到达右下角的位置,路径上的所有数字累加起来作为这条路径的路径和。编写一个程序求所有路径和中的最小路径和。 (2)求解添加最少括号数问题。括号序列由()、{}、[]组成,例如“(([{}]))()”是合法的,而“(}{)”、“({({”和“({)}”都是不合法的。如果一个序列不合法,可以通过添加合适的括号,使这个序列变成合法的。对于一个不合法的序列,编写一个程序求需添加的最少括号数。
时间: 2024-02-22 22:57:36 浏览: 64
c代码-矩阵最小路径和 概述: 给定一个矩阵,大小为m,从左上角开始每次只能向右走或者向下走,最后达到右下角的位置。路径中所有数字累加起来就是路径和,返回所有路径的最小路径和。 示例1 比如输入矩阵为 4 1 5 3 3 2 7 7 6 5 2 8 8 9 4 5 最小路径为 23
(1)矩阵最小路径和问题可以使用动态规划求解。定义一个二维数组dp,其中dp[i][j]表示从左上角到(i,j)位置的最小路径和。则动态转移方程为:dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + matrix[i][j],其中matrix[i][j]表示矩阵中(i,j)位置的数字。最终答案为dp[m-1][n-1]。具体实现可以参考下面的代码:
```python
def minPathSum(matrix):
m, n = len(matrix), len(matrix[0])
dp = [[0] * n for _ in range(m)]
dp[0][0] = matrix[0][0]
for i in range(1, m):
dp[i][0] = dp[i-1][0] + matrix[i][0]
for j in range(1, n):
dp[0][j] = dp[0][j-1] + matrix[0][j]
for i in range(1, m):
for j in range(1, n):
dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + matrix[i][j]
return dp[m-1][n-1]
```
(2)添加最少括号数问题可以使用栈来求解。遍历括号序列,如果遇到左括号,则将其入栈;如果遇到右括号,则判断栈顶元素是否与之匹配,若匹配则弹出栈顶元素,否则将当前右括号入栈。最终栈中剩余的元素个数即为需要添加的最少括号数。具体实现可以参考下面的代码:
```python
def minAddToMakeValid(s):
stack = []
for c in s:
if c in '({[':
stack.append(c)
else:
if not stack:
stack.append(c)
elif c == ')' and stack[-1] == '(':
stack.pop()
elif c == '}' and stack[-1] == '{':
stack.pop()
elif c == ']' and stack[-1] == '[':
stack.pop()
else:
stack.append(c)
return len(stack)
```
阅读全文