调度中心将司机平均分给A、B两个区域,i号司机去A的收入为income[i][0]
去B的收入为income[i][1],返回最高收入
public static int maxMoney1(int income[][]){
if(income==null||income.length<2||(income.length&1)!=0){
return 0;
}
int N=income.length;
int M=N>>1;
return process1(income,0,M);
}
public static int process1(int income[][],int index,int rest){
if(index==income.length){
return 0;
}
if(income.length-index==rest){
return income[index][0]+process1(income,index+1,rest-1);
}
if(rest==0){
return income[index][1]+process1(income,index+1,rest);
}
int p1=income[index][0]+process1(income,index+1,rest-1);
int p2=income[index][1]+process1(income,index+1,rest);
return Math.max(p1,p2);
}
public static int maxMoney2(int income[][]){
int N=income.length;
int M=N>>1;
int dp[][]=new int[N+1][M+1];
for (int i = N-1; i >=0; i--) {
for (int j = 0; j <=M ; j++) {
if(N-i==j){
dp[i][j]=income[i][0]+dp[i+1][j-1];
}else if(j==0){
dp[i][j]=income[i][1]+dp[i+1][j];
}else{
int p1 = income[i][0] + dp[i + 1][j - 1];
int p2 = income[i][1] + dp[i + 1][j];
dp[i][j] = Math.max(p1, p2);
}
}
}
return dp[0][M];
}
public static int[][] randomMatrix(int len, int value) {
int[][] ans = new int[len << 1][2];
for (int i = 0; i < ans.length; i++) {
ans[i][0] = (int) (Math.random() * value);
ans[i][1] = (int) (Math.random() * value);
}
return ans;
}
public static void main(String[] args) {
int N = 10;
int value = 100;
int testTime = 500;
System.out.println("测试开始");
for (int i = 0; i < testTime; i++) {
int len = (int) (Math.random() * N) + 1;
int[][] matrix = randomMatrix(len, value);
int ans1 = maxMoney1(matrix);
int ans2 = maxMoney2(matrix);
if (ans1 != ans2 ) {
System.out.println(ans1);
System.out.println(ans2);
System.out.println("Oops!");
}
}
System.out.println("测试结束");
}