只需要每次把数字左边和数字上面的两个数字取最小的一个即可(数字只能从这两个方向移动)。
如果另外开一个dp数组大概率存不下。
所以直接操作原数组,注意边界位置,样例结果为11的就是忘记处理第一行和第一列了。
状态转移方程:dp[i][j] = min(dp[i-1][j],dp[i][j-1]) + v[i][j]
最后一个格子(n,m)为最短路径和的结果
#include <iostream>
#include <vector>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n,m;
cin>>n>>m;
vector<vector<int>> v(n+1,vector<int>(m+1,0));
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
int t;
cin>>t;
if(i==1){
v[i][j]=t+v[i][j-1];
continue;
}
if(j==1){
v[i][j]=t+v[i-1][j];
continue;
}
v[i][j]=min(v[i][j-1],v[i-1][j])+t;
}
}
cout<<v[n][m];
}

京公网安备 11010502036488号