猛兽侠中精灵鼠在利剑飞船的追逐下逃到一个n*n的建筑群中,精灵鼠从(0,0)的位置进入建筑群,建筑群的出口位置为(n-1,n-1),建筑群的每个位置都有阻碍,每个位置上都会相当于给了精灵鼠一个固定值减速,因为精灵鼠正在逃命所以不能回头只能向前或者向下逃跑,现在问精灵鼠最少在减速多少的情况下逃出迷宫?
猛兽侠中精灵鼠在利剑飞船的追逐下逃到一个n*n的建筑群中,精灵鼠从(0,0)的位置进入建筑群,建筑群的出口位置为(n-1,n-1),建筑群的每个位置都有阻碍,每个位置上都会相当于给了精灵鼠一个固定值减速,因为精灵鼠正在逃命所以不能回头只能向前或者向下逃跑,现在问精灵鼠最少在减速多少的情况下逃出迷宫?
第一行迷宫的大小: n >=2 & n <= 10000;
第2到n+1行,每行输入为以','分割的该位置的减速,减速f >=1 & f < 10。
精灵鼠从入口到出口的最少减少速度?
3 5,5,7 6,7,8 2,2,4
19
/*
递归的思想:试一试(不太行,超时了)
*//*
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int[][] arr = new int[n][n];
for(int i = 0;i<n;i++){
String[] str = br.readLine().split(",");
for(int j = 0;j<n;j++){
arr[i][j] = Integer.parseInt(str[j]);
}
}
int count = Fuc(0,0,n,arr);
System.out.println(count);
}
//
public static int Fuc(int x,int y,int n,int[][] arr){
if(x==n-1 && y==n-1)return arr[x][y];
if(x == n-1 && y<n-1)return Fuc(x,y+1,n,arr)+arr[x][y];
if(x < n-1 && y == n-1)return Fuc(x+1,y,n,arr)+arr[x][y];
return Math.min(Fuc(x+1,y,n,arr),Fuc(x,y+1,n,arr))+arr[x][y];//两者选最小
}
}*/
/*
动态规划试一试:dp[i][j]:表示到达坐标[i,j]时产生的最少减速
状态转移:
dp[i][j] = Min(dp[i-1][j],dp[i][j-1]) + arr[i][j];
*/
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int[][] arr = new int[n][n];
for(int i = 0;i<n;i++){
String[] str = br.readLine().split(",");
for(int j = 0;j<n;j++){
arr[i][j] = Integer.parseInt(str[j]);
}
}
int[][] dp = new int[n][n];
dp[0][0] = arr[0][0];//dp[0][1] = dp[0][0]+arr[0][1];
//dp[1][0] = dp[0][0] + arr[1][0];
for(int i = 0;i<n;i++){
for(int j = 0;j<n;j++){
if(i==0 &&j==0)continue;
//边界情况,i==0时dp[0][j]=dp[0][j-1]+arr[0][j];
if(i==0){
dp[0][j]=dp[0][j-1]+arr[0][j];
continue;
}
//边界情况,j==0时dp[i][0]=dp[i-1][0]+arr[i][0];
if(j==0){
dp[i][0]=dp[i-1][0]+arr[i][0];
continue;
}
dp[i][j] = Math.min(dp[i-1][j],dp[i][j-1]) + arr[i][j];
}
}
System.out.println(dp[n-1][n-1]);
}
} import java.util.Scanner;
public class Main {
/**
* 运行时间:544ms
*
* 占用内存:86024k
* */
public static void main(String[] args) {
//取输入的数据
Scanner scanner = new Scanner(System.in);
int n = Integer.parseInt(scanner.nextLine());
int[][] num = new int[n][n];
for (int i = 0; i < n; i++) {
String[] s = scanner.nextLine().split(",");
for (int j = 0; j < n; j++) {
num[i][j]=Integer.parseInt(s[j]);
}
}
int[][] dp= new int [n][n];
dp[0][0]=num[0][0];
for(int i=1;i<n;i++){
dp[i][0]=num[i][0]+dp[i-1][0];
dp[0][i]=num[0][i]+dp[0][i-1];
}
for(int i=1;i<n;i++)
for(int j=1;j<n;j++)
dp[i][j]=Math.min(dp[i-1][j],dp[i][j-1])+num[i][j];
System.out.println(dp[n-1][n-1]);
}
}
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int[][] map = new int[n][n];
for (int i = 0; i < n; i++) {
String[] str = br.readLine().split(",");
for (int j = 0; j < n; j++) {
map[i][j] = Integer.parseInt(str[j]);
}
}
int[][] dp = new int[n][n];
dp[0][0] = map[0][0];
for (int i = 1; i < n; i++) {
dp[0][i] = dp[0][i - 1] + map[0][i];
}
for (int i = 1; i < n; i++) {
dp[i][0] = dp[i - 1][0] + map[i][0];
}
for (int i = 1; i < n; i++) {
for (int j = 1; j < n; j++) {
dp[i][j] = Math.min(dp[i][j - 1], dp[i - 1][j]) + map[i][j];
}
}
System.out.println(dp[n - 1][n - 1]);
}
}