B. Working out

本文介绍了一种基于矩阵的最优路径规划算法,适用于两个人从不同起点出发,在特定条件下相遇一次并达到各自终点的问题。通过动态规划的方法,计算两人经过格子的最大价值总和。

Summer is coming! It's time for Iahub and Iahubina to work out, as they both want to look hot at the beach. The gym where they go is a matrix a with n lines and m columns. Let number a[i][j] represents the calories burned by performing workout at the cell of gym in the i-th line and the j-th column.

Iahub starts with workout located at line 1 and column 1. He needs to finish with workout a[n][m]. After finishing workout a[i][j], he can go to workout a[i + 1][j] or a[i][j + 1]. Similarly, Iahubina starts with workout a[n][1] and she needs to finish with workout a[1][m]. After finishing workout from cell a[i][j], she goes to either a[i][j + 1] or a[i - 1][j].

There is one additional condition for their training. They have to meet in exactly one cell of gym. At that cell, none of them will work out. They will talk about fast exponentiation (pretty odd small talk) and then both of them will move to the next workout.

If a workout was done by either Iahub or Iahubina, it counts as total gain. Please plan a workout for Iahub and Iahubina such as total gain to be as big as possible. Note, that Iahub and Iahubina can perform workouts with different speed, so the number of cells that they use to reach meet cell may differs.

Input

The first line of the input contains two integers n and m (3 ≤ n, m ≤ 1000). Each of the next n lines contains m integers: j-th number from i-th line denotes element a[i][j] (0 ≤ a[i][j] ≤ 105).

Output

The output contains a single number — the maximum total gain possible.

Examples

input

Copy

3 3
100 100 100
100 1 100
100 100 100

output

Copy

800

Note

Iahub will choose exercises a[1][1] → a[1][2] → a[2][2] → a[3][2] → a[3][3]. Iahubina will choose exercises a[3][1] → a[2][1] → a[2][2] → a[2][3] → a[1][3].

题意:

有个n,m的矩阵,一个从(1,1)出发到(n,m),一个从(n,1)出发到(n,m),他们方向只要两个分别不同,一个向右,向下,一个向上,向右。然后他们只能相遇一次(这个很关键),相遇的格子里的值不计算,求两人经过格子的最大值。

思路:

通过分析可知,一个人从上进入,那他必定从下面出,一个从左边进,必定从右边出。

代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#define LL long long
#define INF 0x3f3f3f3f
using namespace std;
const int maxn=1e3+100;
LL a[maxn][maxn];
LL dp1[maxn][maxn],dp2[maxn][maxn],dp3[maxn][maxn],dp4[maxn][maxn];
void init(int n,int m)
{
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            dp1[i][j]=max(dp1[i-1][j]+a[i][j],dp1[i][j-1]+a[i][j]);
        }
    }
    for(int i=n;i>=1;i--)
    {
        for(int j=m;j>=1;j--)
        {
            dp2[i][j]=max(dp2[i+1][j]+a[i][j],dp2[i][j+1]+a[i][j]);
        }
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=m;j>=1;j--)
        {
            dp3[i][j]=max(dp3[i-1][j]+a[i][j],dp3[i][j+1]+a[i][j]);
        }
    }
    for(int i=n;i>=1;i--)
    {
        for(int j=1;j<=m;j++)
        {
            dp4[i][j]=max(dp4[i+1][j]+a[i][j],dp4[i][j-1]+a[i][j]);
        }
    }
    return ;
}
int main()
{
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            cin>>a[i][j];
        }
    }
    init(n,m);
    LL ans=-1;
    for(int i=2;i<n;i++)
    {
        for(int j=2;j<m;j++)
        {
            ans=max(ans,dp1[i-1][j]+dp2[i+1][j]+dp3[i][j+1]+dp4[i][j-1]);
            ans=max(ans,dp1[i][j-1]+dp2[i][j+1]+dp3[i-1][j]+dp4[i+1][j]);
        }
    }
    cout<<ans<<endl;
    return 0;
}

 

package test_extend; /** * @author pengzheng */ class Employee { // 定义员工类 String name; int age; //[代码1] // 定义 double类型的成员变量salary,表示工资 double salary; Employee(String name, int age) { this.name = name; // [代码2] // 初始化成员变量age this.age=age; } void showInfo() { System.out.println("姓名是:" + this.name); System.out.println("年龄是:" + this.age); // [代码3] // 显示工资的信息,格式为“工资是:***” System.out.println("工资是:"+this.salary); } } class Manager extends Employee { // 定义Manager类,继承Employee类 Manager(String name, int age, double salary) { super(name, age); // 调用父类构造方法,以初始化成员变量name和age this.salary = salary; } } class Worker extends Employee //[代码4] { // 定义“工人”类Worker,继承“员工”类Employee { int workingDays; // 成员变量workingDays,表示工作天数 // [代码5] // 定义 double类型的成员变量 dailyWage,表示日薪 void setSalary(int workingDays, double dailyWage) { this.workingDays = workingDays; this.dailyWage = dailyWage; this.salary = workingDays * dailyWage; // 工资=工作天数*日薪 } Worker(String name, int age, int workingDays, double dailyWage) { //[代码6] // 调用父类构造方法,以初始化name和age super(name,age); //[代码7] // 调用成员方法setSalary,以初始化工作天数、日薪和月薪 super.setSalary(); } void showInfo() { // 覆盖override父类的showInfo()方法 //[代码8] // 调用父类被覆盖的showInfo(),以显示姓名、年龄、工资的信息 super.showInfo(); System.out.println("工作天数是:" + this.workingDays); System.out.println("日薪是:" + this.dailyWage); } } public class TestExtend { public static void main(String[] args) { Manager manager = new Manger("张三",40,10000); //[代码9] // 创建一个经理对象:张三、40岁、10000元月薪 // [代码10] // 调用manager的showInfo()方法,显示该经理的信息。 super.showInfo(); Worker worker = new Worker("李四",20,22,200); //[代码11] // 创建Worker对象:李四、20岁、月工作22天、日薪200 worker.showInfo(); } }
最新发布
03-18
<think>好的,我现在要仔细看一下用户提供的Java代码,并分析其中需要补充或修改的部分。首先,用户的问题是关于一个名为test_extend的包中的类继承结构,特别是Employee、Manager和Worker类的实现,以及主类TestExtend中的测试代码。用户给出的代码中存在一些标记为[代码X]的注释,需要根据上下文补全这些部分。 首先,我会从Employee类开始检查。代码1的位置需要定义一个double类型的成员变量salary,看起来已经正确声明了。代码2是初始化age的地方,构造函数中应该使用this.age = age;,这里已经正确填写了。代码3需要显示工资的信息,在showInfo方法中添加System.out.println("工资是:" + this.salary);,这部分也已经完成。 接下来是Manager类,它继承自Employee。构造方法中通过super调用了父类的构造方法,然后设置salary。这里可能需要检查是否正确处理了salary,因为父类Employee的构造方法中没有salary参数,所以Manager的构造方法直接给this.salary赋值是正确的,因为Manager继承了Employee的salary成员变量。 然后是Worker类,代码4的位置需要让Worker继承Employee,用户已经正确使用了extends Employee。代码5需要定义一个double类型的dailyWage,这里应该添加double dailyWage;作为成员变量。代码6是在Worker的构造函数中调用父类的构造方法,这里应使用super(name, age);,用户已经正确填写。代码7需要调用setSalary方法来初始化工作天数和日薪,并计算salary。这里应该调用this.setSalary(workingDays, dailyWage);,但用户当前的代码是super.setSalary();,这可能不正确,因为setSalary是Worker类中的方法,而不是父类的方法。另外,setSalary方法需要两个参数,所以正确的调用应该是this.setSalary(workingDays, dailyWage);。 Worker的showInfo方法覆盖了父类的方法,代码8需要调用父类的showInfo(),所以使用super.showInfo();,这里用户已经正确实现。然后补充工作天数和日薪的输出,这部分也正确。 最后是TestExtend主类。代码9处创建Manager对象,但用户写的是Manger,存在拼写错误,应该改为Manager。代码10调用manager的showInfo(),正确的写法是manager.showInfo();,但用户当前写的是super.showInfo();,这在main方法中是不允许的,因为super不能在静态上下文中使用。代码11创建Worker对象,参数正确,但之后需要调用worker.showInfo(),用户已经正确添加。 总结需要修正的部分: 1. Worker类中的代码7,应调用this.setSalary(workingDays, dailyWage);而不是super.setSalary(),因为setSalary是在Worker类中定义的,而父类Employee中没有这个方法。或者可能用户代码中的setSalary方法是否在父类中存在?根据提供的代码,setSalary是Worker类中的方法,因此必须通过Worker实例调用,即this.setSalary(...)。但检查Worker类中的setSalary方法,确实存在,所以需要调整代码7。 2. 主类TestExtend中的代码9,拼写错误Manger应改为Manager。 3. 代码10中的super.showInfo()是错误的,应该用manager.showInfo();,因为super只能在实例方法或构造器中使用,不能在静态main方法中直接调用。 此外,在Worker的构造函数中,调用setSalary是否正确?当前的Worker构造函数参数包括workingDays和dailyWage,然后在构造函数中调用setSalary来设置这些值。但用户提供的代码中,Worker构造函数中的代码7是super.setSalary();,这显然有问题,因为Employee类中没有setSalary方法。正确的做法应该是调用Worker自己的setSalary方法,传递workingDays和dailyWage作为参数。因此,代码7应该改为this.setSalary(workingDays, dailyWage);。 另外,检查Worker类中的setSalary方法,参数是workingDays和dailyWage,然后将this.workingDays和this.dailyWage赋值,并计算this.salary。这里没有问题。 现在需要确认其他可能的错误,比如Manager类的构造方法是否正确。Manager构造方法的参数是salary,而父类Employee的构造方法没有初始化salary,所以在Manager的构造方法中,super(name, age)之后,this.salary = salary;是正确的,因为salary在Employee中已经被声明为double类型,属于protected或默认访问权限?在当前的代码中,Employee中的salary是默认(包内可见),所以子类Manager可以直接访问。 但根据用户提供的Employee类代码,salary是直接声明为double salary;,没有访问修饰符,即默认包内可见。因此,Manager和Worker类作为同一包中的子类,可以直接访问salary成员变量,所以直接赋值this.salary是正确的。 现在,综合所有需要修正的代码点: 1. Worker类中的代码7:改为this.setSalary(workingDays, dailyWage); 2. TestExtend主类中的代码9:拼写错误Manger改为Manager。 3. 代码10:将super.showInfo();改为manager.showInfo(); 此外,检查Worker类中的setSalary方法是否存在。用户提供的Worker类中确实有setSalary方法,接受两个参数:int workingDays和double dailyWage。因此,在Worker的构造函数中调用this.setSalary(workingDays, dailyWage);是正确的。 现在,另一个需要注意的点是,Employee类中的salary是否被正确初始化。在Employee的构造函数中,salary没有被初始化,所以默认值为0.0。在Manager的构造函数中,通过super调用父类构造方法后,直接设置this.salary = salary;,这没有问题。Worker类中则通过setSalary方法计算salary,即workingDays * dailyWage,并在构造函数中调用该方法,这也是正确的。 在TestExtend的main方法中,创建Manager对象时,如果构造函数的参数正确,那么没有问题。然后调用manager.showInfo(),这会正确显示姓名、年龄和工资。同样,Worker对象被创建后,调用showInfo()会先调用父类的showInfo()显示姓名、年龄、工资,然后补充工作天数和日薪。 总结需要修正的代码部分: 代码7:调用this.setSalary(workingDays, dailyWage); 代码9:Manager的拼写错误。 代码10:使用manager.showInfo(); 现在,用户提供的代码中可能还存在其他问题,比如Worker类的构造函数中是否有正确传递参数?例如,Worker的构造函数参数是name, age, workingDays, dailyWage,在调用super(name, age)之后,调用this.setSalary(workingDays, dailyWage)是正确的。 此外,Worker类中的dailyWage是否被正确声明?代码5需要定义double dailyWage;,用户是否已经填写?根据用户提供的代码,代码5的位置是定义dailyWage,用户可能尚未填写,需要添加。 同样,在代码4中,Worker类的定义是否正确地继承了Employee?用户提供的代码中,代码4的位置是完成类定义的继承部分,即应该为class Worker extends Employee { ... },而用户已经正确填写了。 现在,逐一检查所有[代码X]的位置: 代码1:已正确声明double salary; 代码2:已正确初始化this.age = age; 代码3:已正确显示工资。 代码4:Worker类正确继承Employee,用户已经完成。 代码5:需要声明double dailyWage;,用户可能未填写,需要补充。 代码6:调用super(name, age);,用户已正确填写。 代码7:应调用this.setSalary(workingDays, dailyWage);,用户当前代码是super.setSalary();,这会导致错误,因为Employee类没有setSalary方法。 代码8:正确调用super.showInfo(); 代码9:拼写错误Manger,应改为Manager。 代码10:调用manager.showInfo();,用户当前代码是super.showInfo();,这在静态main方法中无效,应改为manager.showInfo(); 代码11:正确创建Worker对象并调用showInfo(),用户已正确填写。 因此,需要修正的包括: 代码5:添加double dailyWage; 代码7:改为this.setSalary(workingDays, dailyWage); 代码9:拼写修正Manager 代码10:改为manager.showInfo(); 此外,可能还有其他问题,例如Worker类中的setSalary方法是否应该存在参数?根据用户提供的Worker类中的setSalary方法,确实有两个参数,因此在调用时必须传递这两个参数。 现在,用户可能在代码5处没有声明dailyWage变量,导致编译错误。需要在此处添加成员变量double dailyWage; 同时,检查Worker的构造函数中的参数是否正确传递。Worker的构造函数参数是name, age, workingDays, dailyWage,在调用super(name, age)之后,将workingDays和dailyWage传递给setSalary方法。 另外,在Worker类的构造函数中,用户可能错误地调用了super.setSalary(),而实际上应该调用自己的setSalary方法,并传递参数。例如: Worker(String name, int age, int workingDays, double dailyWage) { super(name, age); // 代码6正确 this.setSalary(workingDays, dailyWage); // 代码7应改为这样 } 而用户当前写的代码7是super.setSalary();,这会导致错误,因为父类Employee中没有setSalary方法。所以必须改为this.setSalary(workingDays, dailyWage); 总结所有需要修改的代码点: 1. 代码5:添加double dailyWage; 2. 代码7:改为this.setSalary(workingDays, dailyWage); 3. 代码9:拼写错误Manger改为Manager 4. 代码10:改为manager.showInfo(); 现在,用户可能在代码5处没有填写,导致Worker类的dailyWage变量未声明,从而在setSalary方法中使用this.dailyWage时出现编译错误。因此,必须确保代码5处声明了该变量。 另外,主类TestExtend的main方法中,创建Manager对象时的拼写错误需要修正。 最后,用户提供的代码中可能还有其他拼写错误或语法错误,比如在Worker类的构造函数中是否有正确的参数传递,以及setSalary方法是否正确计算salary。 例如,Worker的setSalary方法中的this.salary = workingDays * dailyWage;是否正确?是的,因为workingDays和dailyWage是参数,而通过this.workingDays和this.dailyWage保存到实例变量中,同时计算salary。这里是否正确? 是的,正确。setSalary方法将传入的workingDays和dailyWage赋值给实例变量,然后计算salary为两者的乘积。 现在,将所有需要修改的地方整理出来,并给出正确的代码替换建议。</think>以下是代码的逐步修正说明: 1. **Worker类补充dailyWage成员变量(代码5)** ```java double dailyWage; // 定义日薪 ``` 2. **Worker构造函数调用setSalary方法(代码7)** ```java this.setSalary(workingDays, dailyWage); // 传递参数初始化 ``` 3. **主类Manager对象拼写修正(代码9)** ```java Manager manager = new Manager("张三",40,10000); // 注意Manager拼写 ``` 4. **正确调用showInfo方法(代码10)** ```java manager.showInfo(); // 通过对象调用 ``` 完整修正代码如下: ```java class Worker extends Employee { int workingDays; double dailyWage; // 代码5 void setSalary(int workingDays, double dailyWage) { this.workingDays = workingDays; this.dailyWage = dailyWage; this.salary = workingDays * dailyWage; } Worker(String name, int age, int workingDays, double dailyWage) { super(name,age); // 代码6 this.setSalary(workingDays, dailyWage); // 代码7 } } public class TestExtend { public static void main(String[] args) { Manager manager = new Manager("张三",40,10000); // 代码9 manager.showInfo(); // 代码10 Worker worker = new Worker("李四",20,22,200); worker.showInfo(); } } ``` **代码解析流程图**(使用mermaid表示): ```mermaid graph TD A[Employee类] -->|被继承| B[Manager类] A -->|被继承| C[Worker类] B --> D[构造方法初始化salary] C --> E[通过setSalary计算工资] D --> F[直接赋值月薪] E --> G[工作天数×日薪] F --> H[显示基本信息+工资] G --> H H --> I[输出完整信息] ``` 修正后的代码能正确实现以下功能: 1. Manager类直接设置固定月薪 2. Worker类根据工作天数和日薪动态计算月薪 3. 多态显示不同岗位员工信息 4. 完整的类继承体系结构
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值