资深光能
最小路径和
题目详情
题目描述 De**ion
小P在一个由m * n块砖铺成的房间中。每块砖上都写上了一个数字。小P现在想从房间的左上角第(0,0)块砖位置开始,走到右下角第(m-1,n-1)的位置,要求经过路径上的数字之和最小,且只能往右和往下走。请你编写一个程序计算出这个最小的数字之和。
输入描述 Input De**ion
m+1行,第一行两个整数m、n,表示房间的大小
接下来m行,每行n个整数,表示砖块上的数字
输出描述 Output De**ion
一个整数,表示最小路径和
样例输入 Sample Input
3 4 1 2 3 4 8 7 6 5 1 3 5 7
样例输出 Sample Output
22
数据范围及提示 Data Size & Hint
1<m,n<=20,砖块上的每个数字不超过100
我的代码:
#include<bits/stdc++.h>
using namespace std;
int m,n;
int a[25][25],f[25][25];
int main(){
cin>>m>>n;
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
cin>>a[i][j];
}
}
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(i==1&&j==1){
f[i][j]=a[i][j];
}else if(j==1){
f[i][j]=f[i-1][j]+a[i][j];
}else if(i==1){
f[i][j]=f[i][j-1]+a[i][j];
}else{
f[i][j]=min(f[i-1][j],f[i][j-1])+a[i][j];
}
}
}
int minn=0x3f3f3f3f;
for(int i=1;i<=n;i++){
minn=min(minn,f[n][i]);
}
cout<<minn;
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int m,n;
int a[25][25],f[25][25];
int main(){
cin>>m>>n;
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
cin>>a[i][j];
}
}
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(i==1&&j==1){
f[i][j]=a[i][j];
}else if(j==1){
f[i][j]=f[i-1][j]+a[i][j];
}else if(i==1){
f[i][j]=f[i][j-1]+a[i][j];
}else{
f[i][j]=min(f[i-1][j],f[i][j-1])+a[i][j];
}
}
}
int minn=0x3f3f3f3f;
for(int i=1;i<=n;i++){
minn=min(minn,f[n][i]);
}
cout<<minn;
return 0;
}