PTA 寻宝 JAVA
输入格式:
输入第一行给出两个正整数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 }