[面试算法]招银网络-两数组之积的最大价值

175 阅读1分钟
  • [动态规划 ] [双指针 ]
  • [难度:中等 ]

题目:

有两个长度均为n的数组nums[],values[],每次不重复的从num[]数组头部或尾部取出一个数:

  • 第i次取的值为x,那么第i次的价值为values[i - 1]*x;
  • 价值总和为前i-1次价值之和加上第i次的价值;
  • 求第n次取数最大价值总和; 示例1:

输入:nums=[1,3,5,2,4],values=[1,2,3,4,5]

输出:52

解释

  1. 第1次取nums[0],得到价值nums[0]*values[0] = 1;
  2. 第2次取nums[1],得到价值nums[1]*values[1] = 6;
  3. 第3次取nums[4],得到价值nums[4]*values[2] = 12;
  4. 第4次取nums[3],得到价值nums[3]*values[3] = 8;
  5. 第5次取nums[2],得到价值nums[2]*values[4] = 25;
  6. 5次取值得到的价值总和为52. 示例2: 输入:nums=[1,3],values=[5,1]

输出:7

解释

  1. 第1次取nums[1],得到价值nums[1]*values[0] = 15;
  2. 第2次取nums[0],得到价值nums[0]*values[1] = 1;
  3. 2次取值得到的价值总和为16.

题解:

public static int getMaxValue (int[] nums, int[] values) {
    int[][] dp = new int[nums.length][nums.length];
    for (int l = 0; l < nums.length; l++) {
        for (int m = 0; m < nums.length; m++) {
            int k = m + l;
            if(k >= nums.length)break;
            if(l == 0){
                dp[m][k] = nums[m] * values[nums.length-1-l];
            }else{
            //dp[m][k] = Math.max(dp[m + 1][k]+nums[m]*values[nums.length-1-l],dp[m][k-1]+nums[k]*values[nums.length-1-l]);
                dp[m][k] = Math.max(dp[m + 1][k]+nums[m] * values[nums.length-1-l],
                    dp[m][k-1] + nums[k]*values[nums.length-1-l]);
            }
        }
    }
    return dp[0][nums.length-1];
}