自己出一道穷举的题目,并给出C++的题解
时间: 2024-10-19 17:09:54 浏览: 22
C++基本算法思想之穷举法
题目名称:最小路径和的穷举搜索
**题目描述**:
在一个由整数构成的 m x n 网格中,每一步可以从网格的一个位置移动到它的四个相邻位置之一(上、下、左、右),直到到达网格的边界。初始时,从左上角 (0, 0) 开始,目标是从左上角走到右下角 (m-1, n-1),每次走的路径上数字之和最小。请编写程序找到这个最小路径和。
示例:
```
输入: [
[1,3,1],
[1,5,1],
[4,2,1]
]
输出: 7
解释: 因为最短路径 1→3→1→1→1 的总和是最小的。
```
**思路**:
这是一道经典的穷举搜索(回溯法)问题,我们可以考虑使用深度优先搜索(DFS)或者广度优先搜索(BFS)。这里我们选择深度优先搜索,通过递归地尝试所有可能的方向来寻找最优路径。
**C++ 题解**:
```cpp
#include <vector>
using namespace std;
int minPathSum(vector<vector<int>>& grid) {
int m = grid.size(), n = grid[0].size();
vector<vector<int>> dp(m+1, vector<int>(n+1, INT_MAX));
dp[0][0] = grid[0][0];
// 动态规划,向四个方向遍历
for(int i=1; i<=m; ++i) {
dp[i][0] = dp[i-1][0] + grid[i-1][0];
dp[0][i] = dp[0][i-1] + grid[0][i-1];
}
// 递归填充其他位置
for(int i=1; i<m; ++i) {
for(int j=1; j<n; ++j) {
dp[i][j] = min(min(dp[i-1][j], dp[i][j-1]), dp[i-1][j-1]) + grid[i][j];
}
}
return dp[m-1][n-1];
}
```
阅读全文