- [动态规划 ] [双指针 ]
- [难度:中等 ]
题目:
有两个长度均为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次取nums[0],得到价值nums[0]*values[0] = 1;
- 第2次取nums[1],得到价值nums[1]*values[1] = 6;
- 第3次取nums[4],得到价值nums[4]*values[2] = 12;
- 第4次取nums[3],得到价值nums[3]*values[3] = 8;
- 第5次取nums[2],得到价值nums[2]*values[4] = 25;
- 5次取值得到的价值总和为52. 示例2: 输入:nums=[1,3],values=[5,1]
输出:7
解释:
- 第1次取nums[1],得到价值nums[1]*values[0] = 15;
- 第2次取nums[0],得到价值nums[0]*values[1] = 1;
- 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];
}