题目描述
给定一个 n * m 的矩阵 a,从左上角开始每次只能向右或者向下走,最后到达右下角的位置,路径上所有的数字累加起来就是路径和,输出所有的路径中最小的路径和。
输入描述
第一行输入两个整数n和m,表示矩阵的大小。
接下来n行每行m个整数表示矩阵。
1≤n,m≤2000
输出描述
输出一个整数表示答案。
Sample Input
4 4
1 3 5 9
8 1 3 4
5 0 6 1
8 8 4 0
Sample Output
12
空间压缩技巧
C++:
#include<iostream>
using namespace std;
int main(void)
{
int row,col,t;
cin>>row>>col;
int arr[col];
for (int i = 0; i < row; i++)
for (int j = 0; j < col; j++)
{
cin>>t;
if (i==0)
arr[j]+=(j==0) ? t : arr[j-1]+t;
else if(j==0)
arr[j]=arr[j]+t;
else
arr[j]=(arr[j-1]>arr[j]) ? arr[j]+t : arr[j-1]+t;
}
cout<<arr[col-1]<<endl;
return 0;
}
Java:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int a=sc.nextInt();
int b=sc.nextInt();
int[] arr=new int[b];
for (int i = 0; i < a; i++) {
for (int j = 0; j < b; j++) {
int t=sc.nextInt();
if (i==0) {
arr[j]+=(j==0) ? t : arr[j-1]+t;
}else if(j==0){
arr[j]=arr[j]+t;
}else {
arr[j]=(arr[j-1]>arr[j]) ? arr[j]+t : arr[j-1]+t;
}
}
}
System.out.println(arr[b-1]);
}
}