JAVA——演算法訓練 傳紙條

罡罡同學發表於2020-11-01

演算法訓練 傳紙條

在這裡插入圖片描述

import java.util.*;
public class Main {
public static void main(String[] args)
    {   Scanner sc=new Scanner(System.in);
        int m=sc.nextInt();
        int n=sc.nextInt();
        int[][] room=new int[m+1][n+1];///存放每位同學的好感度
        int[][][][] dp=new int[m+1][n+1][m+1][n+1];
        for(int i=1;i<=m;i++)//二維陣列初始化(且不用陣列[0][0])
        {
            for(int j=1;j<=n;j++)
                room[i][j] = sc.nextInt();
        }
         for(int x1=1;x1<=m;x1++){
            for(int y1=1;y1<=n;y1++){
                for(int x2=1;x2<=m;x2++){
                    for(int y2=1;y2<=n;y2++){
                    //兩個位置相遇了則跳過本次迴圈
                        if((x1<m||y1<n)&&x1==x2&&y1==y2)
                            continue;
                        //相當於從起點到終點找兩條無重複路徑且距離和最大的路徑!!
                        //比較線路1的前一步值
			int compare1=Math.max(dp[x1-1][y1][x2-1][y2],dp[x1-1][y1][x2][y2-1]);//room[x2][y2]在變化
                        //比較線路2的前一步值
                        int compare2=Math.max(dp[x1][y1-1][x2-1][y2],dp[x1][y1-1][x2][y2-1]);//room[x1][y1]在變化
                        //更新最大值
                        //在上一個最大值的基礎上,再新增兩個點的好感度。也就是每次迴圈都有兩個點(一來一回一起計算)
                       dp[x1][y1][x2][y2]=Math.max(compare1,compare2)+room[x1][y1]+room[x2][y2];
                     }
                }
                }
        }
        System.out.println(dp[m][n][m][n]);
    }
}

相關文章