LeetCode(1043 分隔数组求最大值)

如题在这里插入图片描述
典型的动态规划题目,安排上

public static int maxSumAfterPartitioning(int[] A, int K) {
		int[] dp = new int[A.length];
		int bemax = Integer.MIN_VALUE;  //最大值缓存
		for (int i = 0; i < K; i++) {	//当小于k时,对应的最大值就是此前的最大值乘上个数
			if (A[i] > bemax) {
				bemax = A[i];
			}
			dp[i] = bemax * (i + 1);
		}
		for (int i = K; i < A.length; i++) {  //当大于等于k后,对应的最大值当由k种情况比较求取
			int max = Integer.MIN_VALUE;	//最大值缓存
			int maxv = A[i];	//最大数据值缓存
			for (int m = 1; m <= K; m++) {	//对应的k种情况
				max = Math.max(max, dp[i - m] + Math.max(maxv, A[i + 1 - m]) * m);  //比较单次情况与已经判断情况的最大值
				maxv=Math.max(maxv, A[i+1-m]);  	//更新缓存
			}
			dp[i] = max;
		}
		return dp[A.length - 1];
	}

结果在这里插入图片描述
状态转移方程dp[i]=max(A[0]...A[i])*(i+1) (i<K)
max((dp(i-1)+A[i])....dp(i-K)+max(A[i-K+1]...A[i])*K) (i>=K)
还有优化可能,在对K种情况的判断最大值上,后续继续看一下

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值