PTA 寻宝 JAVA

小明有一张藏宝图,上面有m*n个房间,每个房间里面都有一个有一定价值的宝物,小明只能从左上角的房间进入收集宝物,且每次只能向右边或向下边的房间继续寻宝,最终只能从最右下的房间出来。请你帮小明计算下他最多可以收集到多少价值的宝物?

输入格式:

输入第一行给出两个正整数m,n(1=<m,n<=2000),随后给出m行数据,每行都包括n个正整数,中间用空格分割。

输出格式:

输出收集到的最大价值v,题目保证v<10^9。

输入样例:

4 4
1 18 9 3
7 10 6 12
5 13 4 15
2 11 8 16
结尾无空行

输出样例:

78

结尾无空行

 

这道题就是变样的“数塔”问题,使用动态规划解决

代码:

 1 import java.util.Scanner;
 2 public class five{
 3   public static void main(String[] args){
 4        Scanner scan = new Scanner(System.in);
 5        int m = scan.nextInt();
 6        int n = scan.nextInt();
 7        int[][] mg = new int[m][n];
 8        for(int i = 0;i < m;i++)
 9            for(int j = 0;j < n;j++)
10                mg[i][j] = scan.nextInt();
11        System.out.println("-----------------------");
12     //分割输出内容
13        Tools tool = new Tools();
14        tool.Maxm(mg,m,n);
15        for(int i = 0;i < m;i++){
16            for(int j = 0;j < n;j++)
17                System.out.print(mg[i][j] + " ");
18            System.out.println();
19        }
20        System.out.println("-----------------------");
21        System.out.println("最短为" + mg[m - 1][n - 1]);
22 }
23 }
24 class Tools{//记住做动态规划题先找最优子结构
25     int max = 0;
26   public void Maxm(int[][] mg,int m,int n){
27         //dp[i][j] = num[i][j] + max(num[i - 1][j],num[i][j - 1])
28          for(int i = 0;i < m;i++)
29           for(int j = 0;j < n;j++)
30             if(i == 0 && j == 0)continue;
31          //mg[0][0]为出生点,自身便是当前最优解,不需要判断
32          //因为此题小明只能向右或向下走,判断时考虑上方值和左侧值即可
33               else if(i == 0)mg[i][j] += mg[i][j - 1];
34           //如果是第一列的值,直接加正上方的最优解
35               else if(j == 0)mg[i][j] += mg[i - 1][j];
36           //同理,如果是第一行的值,直接加左侧最优解
37               else
38              mg[i][j] += Math.max(mg[i - 1][j],mg[i][j - 1]);  
39         //不在边缘的情况下,需要判断是选择上方值还是左侧值,取最优解
40         }
41   }

 

 

posted @ 2021-12-28 22:03  Imepeto  阅读(106)  评论(0)    收藏  举报