dp题

执行乘法运算的最大分数

题目链接
分析数据:
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;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值