JAVA——算法训练 传纸条

算法训练 传纸条

在这里插入图片描述

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]);
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

罡罡同学

您的鼓励是罡同学最大的前进动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值