Description:每个服务员对不同订单收的小费不一样,且最多接的订单数也不同,求出最多小费的总和。
input:
1
5 3 3
1 2 3 4 5
5 4 3 2 1
output:
21
思路:运用dp,建立一个m*n的数组,当前值的左边代表上一个订单由a服务员接,上边代表上一个订单由b服务员接,从左往右取意味着本订单由b接,从上往下加意味着本订单由a接。
当前的订单次数为横纵坐标和,左边的值加上b[],上边的值加上a[],只要取两者最大值作为当前值即可,然后每次判断一下是否是目前最大值。
代码(之后会注意缩减掉间距,看起来紧凑点):
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int e_num = Integer.parseInt(scan.nextLine());//测试数
while(e_num>0){
String[] count_data = scan.nextLine().split(" ");
int ordercount = Integer.parseInt(count_data[0]);
int row = Integer.parseInt(count_data[1]);
int col = Integer.parseInt(count_data[2]);
String a[] = scan.nextLine().split(" ");
String b[] = scan.nextLine().split(" ");
int[][] matrix = new int[row+1][col+1];
matrix[0][1] = Integer.parseInt(b[0]);
int max = matrix[0][1];
matrix[1][0] = Integer.parseInt(a[0]);
max = Math.max(max,matrix[1][0]);
//初始化第一行
for(int i=2;i<=col;i ++){
matrix[0][i] = Integer.parseInt(b[i-1])+matrix[0][i-1];
max = Math.max(max,matrix[0][i]);
}
//初始化第一列
for(int i=2;i<=row;i ++){
matrix[i][0] = Integer.parseInt(a[i-1])+matrix[i-1][0];
max = Math.max(max,matrix[i][0]);
}
for(int i=1;i<=row;i ++){
for(int j=1;j<=col;j ++){
if(i+j <= ordercount){
if(matrix[i-1][j] > matrix[i][j-1]){
matrix[i][j] = matrix[i-1][j]+Integer.parseInt(a[i+j-1]);
}else{
matrix[i][j] = matrix[i][j-1]+Integer.parseInt(b[i+j-1]);
}
}
max = Math.max(max,matrix[i][j]);
}
}
System.out.println(max);
e_num --;
}
}
}