提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
一、题目
二、代码
1.dfs
代码如下:
class Solution
{
int res = 0,ans = 50000;
int mp[210][210];
bool st[210][210];
int n,m;
int dfs(vector<vector<int>>& g,int x,int y)
{
if(x == n - 1 && y == m - 1)
return 0;
if (mp[x][y] != -1) return mp[x][y];
int res = 0x3f3f3f3f;
for(int i = 0;i < 2;i ++)
{
int dx[2] = {0,1},dy[2] = {1,0};
int tx = dx[i] + x,ty = dy[i] + y;
if(tx >= 0 && tx < n && ty >= 0 && ty < m && !st[tx][ty])
{
st[tx][ty] = true;
res = min(res, g[tx][ty] + dfs(g, tx, ty));
st[tx][ty] = false;
}
}
mp[x][y] = res;
return res;
}
public:
int minPathSum(vector<vector<int>>& g)
{
memset(mp, -1, sizeof mp);
n = g.size();
m = g[0].size();
res = g[0][0];
st[0][0] = true;
return g[0][0] + dfs(g,0,0);
}
};
解题思路:普通的dfs无法通过所有数据,需要加个map记忆化。
2.dp
代码如下:
class Solution {
public:
int minPathSum(vector<vector<int>>& g) {
int n = g.size();
int m = g[0].size();
for(int i = 0;i < n;i ++)
{
for(int j = 0;j < m;j ++)
{
if(i == 0 && j == 0) continue;
else if(i == 0) g[i][j] = g[i][j - 1] + g[i][j];
else if(j == 0) g[i][j] = g[i - 1][j] + g[i][j];
else
{
g[i][j] = min(g[i][j - 1],g[i - 1][j]) + g[i][j];
}
}
}
return g[n - 1][m - 1];
}
};