执行乘法运算的最大分数
题目链接
分析数据:
nums长度为n;
multipliers长度为m;
1<=m<=1000;
1<=n<=100000;
nums和multipliers都在(-1000,1000);
对于每一个multipliers[i]都需要和nums左右两端的数字组合,需要求得最大的匹配值。
设dp[]i[j]状态为左边取i个,右边取j个。
i=0时, dp[0][j]=dp[0][j-1]+nums右边第j个乘上multipliers[];
j=0时,dp[i][0]=dp[i-1][0]+nums左边第i个乘上multipliers[];
其他情况时就需要取最大的值;
对于每一个dp[i][j]的状态都是固定的最优解。后面的状态都可以由前面的状态推导得出来。dp就应该找到这样的逻辑关系,再通过方程表达出来。
class Solution {
public int maximumScore(int[] nums, int[] multipliers) {
int n=nums.length;
int m=multipliers.length;
int dp[][]=new int [m+9][m+9];
dp[0][0]=0;
int ans=1<<31;
for(int k=1;k<=m;++k) {
for(int i=0;i<=k;++i) {
if(i==0) {
dp[0][k]=dp[0][k-1]+nums[n-k]*multipliers[k-1];
}else if(i==k) {
dp[k][0]=dp[k-1][0]+nums[k-1]*multipliers[k-1];
}else {
dp[i][k-i]=Math.max(dp[i-1][k-i]+nums[i-1]*multipliers[k-1], dp[i][k-i-1]+nums[n-k+i]*multipliers[k-1]);
}
if(k==m) {
ans=Math.max(ans,dp[i][k-i]);
}
}
}
return ans;
}
}