南大高级算法作业之订单问题

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 --;
		}
    }
}
发布了36 篇原创文章 · 获赞 2 · 访问量 1979

猜你喜欢

转载自blog.csdn.net/fumonster/article/details/103181714