给定一个包含非负整数的 m x n 表格 ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。
输入格式:
第一行输入表格的行m和列n,空格分隔。m,n均小于等于100
第二行开始,按行输入表格的非负整数。
输出格式:
最小的路径之和。
输入样例:
在这里给出一组输入。例如:
3 3
1 3 1
1 5 1
4 2 1
输出样例:
在这里给出相应的输出。例如:
7
#include<bits/stdc++.h>
using namespace std;
int m, n;
int ans;
int u;
int a[1005][1005];
int dp[1005][1005];
int pre[1005][1005];
void dpsort() {
for (int i = 1;i <= m;i++) {
for (int j = 1;j <= n;j++) {
if (i == 1 && j == 1) {
dp[i][j] = a[i][j];
pre[i][j] = j;
continue;
}
if (j == 1) {
dp[i][j] = dp[i - 1][j] + a[i][j];
pre[i][j] = j;
}
else if (i == 1)
dp[i][j] = dp[i][j - 1] + a[i][j];
else
dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + a[i][j];
}
}
}
void path() {
stack<int> st;
st.push(a[m][n]);
int i = m;
int j = n;
while (i != 1 || j != 1) {
if (i == 1) {
st.push(a[i][j - 1]);
j = j - 1;
}
else if (j == 1) {
st.push(a[i - 1][j]);
i = i - 1;
}
else if (dp[i][j - 1] < dp[i - 1][j]) {
st.push(a[i][j - 1]);
j = j - 1;
}
else {
st.push(a[i - 1][j]);
i = i - 1;
}
}
while (!st.empty()) {
int t = st.top();
st.pop();
printf("%d ", t);
}
cout << endl;
}
int main() {
cin >> m >> n;
for (int i = 1;i <= m;i++) {
for (int j = 1;j <= n;j++) {
cin >> a[i][j];
}
}
dpsort();
// path();
cout << dp[m][n];
}