codeforces 1469B - Red and Blue,dp学习

文章讨论了一种计算两个数组元素组合最大和的方法,首先通过暴力枚举所有可能的组合,然后优化利用前缀和减少计算量,最终降低空间复杂度到只用一个变量。代码示例给出了C++实现。
array1={6 -5 7 -3}
array2={2 3 -4}

根据题意,首先想到的暴力方法是按两个数组顺序构造一个长度为n的数组array(n=1,2,3,4.....),每个数组的和最大(题目要求选出这些数组的和中最大和)

以下是n等于1,2,3.....时的和最大的数组array以及它的和:

当n=1时:array={6},maxsum=6;

当n=2时:array={6,2},maxsum=8;

当n=3时:array={6,2,3},maxsum=11;

n=4:array={6,2,3,-4},maxsum=7;

n=5:array={6,2,-5,7},maxsum=10;

n=6:array={6,2,-5,7,3},maxsum=13;

n=7:array={6,2,-5,7,3,-3},maxsum=10;

n=8:array={6,2,-5,7,3,-3,-4},maxsum=6;

观察可发现上述任何一个array都是上述所给数组array1前m1个元素与array2前m2个元素的合成(其中m1+m2=n),其中题目其实只要求我们求输出最大的maxsum,对合成数组array并不关心;

所以我们观察maxsum的求法:array1前m1个元素与array2前m2个元素的合成(其中m1+m2=n)

其中m1+m2共有array1.size()*array2.size()种求法;

因此可以使用array1与array2的前缀和来简化

array1前缀和:6,1,8,5;

array2前缀和:2,5,1;

然后用两个for循环枚举array1.size()*array2.size()种情况;


#include<iostream>
#include<vector>
#include<map>
#inclu
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值