leetcode 2321.拼接数组的最大分数

思路:dp

这道题其实确实是有点难想,而且是很难联想到做法的那种。(需要有一定的经验才行)但是如果说有了思路,其实就很简单了。

我们可以在草纸上画上一下。比如,我们以第一个数组为基准,我们换出的数组就是nums1left.....nums1right,换入的数组就是nums2left....nums2right

把nums1的元素总和称为sum1,那么在交换数组的元素之后我们就得到了新的元素和sum=sum1-(nums1left+...numsright)+(nums2left....numsright)。

我们把上面这个式子去一下括号,按照索引下标相同的原则进行合并可以得到:

sum=sum1+(nums2left-nums1left)+(nums2left+1-nums1left+1)+...+(nums2right\[-nums2\[right)

我们把nums2\[\]-nums1\[\]这种形式新定义一个数组就是diff,nums2left-nums1left=diffleft这么记作。

那么上面这个式子就进一步变成了:sum=sum1+diffleft+...diffright.

OK,到这里,相信大家会想到有一点思路,我们是不是在前面做过最大子数组和的题目呢?我们其实是不是可以把diff数组里面的最大子数组和提取出来然后和sum1相加不就是交换之后的最大和了嘛?是的,就是这样,所以我们再对diff进行动规操作。

上面只是基于对nums1进行操作的,我们还有nums2,所以这样的操作进行两次就行,然后取最大值就行了。

上代码:

复制代码
class Solution {
public:
    int maximumsSplicedArray(vector<int>& nums1, vector<int>& nums2) {
         int n=nums1.size();
         vector<int>dp(n+1,0);
         int sum1=0;
         int sum2=0;
         vector<int>diff1;
         vector<int>diff2;
         for(int i=0;i<n;i++){
            sum1+=nums1[i];
            sum2+=nums2[i];
            diff1.push_back(nums2[i]-nums1[i]);
            diff2.push_back(nums1[i]-nums2[i]);
         }
         int max1_dp=0;
         int max2_dp=0;
         int max1=INT_MIN;
         int max2=INT_MIN;
         for(int i=0;i<n;i++){
            max1_dp=max(max1_dp,0)+diff1[i];
            max2_dp=max(max2_dp,0)+diff2[i];

            max1=max(max1,max1_dp);
            max2=max(max2,max2_dp);
         }
         return max(sum1+max1,sum2+max2);
    }
};
相关推荐
budingxiaomoli1 天前
动态规划--斐波那契数列模型
算法·动态规划
IT猿手1 天前
多目标优化算法:多目标蛇优化算法(Multiple Objective Snake Optimizer,MOSO)(提供MATLAB代码)
开发语言·算法·matlab·动态路径规划·光伏模型参数估计
朔北之忘 Clancy1 天前
2026 年 3 月青少年软编等考 C/C++ 一级真题解析
c语言·开发语言·c++·青少年编程·题解·考级
MegaDataFlowers1 天前
101.对称二叉树
算法
小成202303202651 天前
C++~01面向对象基础
开发语言·c++
Jasmine_llq1 天前
《B3939 [GESP样题 四级] 绝对素数》
数据结构·算法·素数判断算法·数字拆分与反转算法·区间遍历枚举·双条件判断逻辑
workflower1 天前
具身智能研究对象:物理交互中的智能行为
设计模式·动态规划·软件工程·软件构建·scrum
郝学胜-神的一滴1 天前
干货版《算法导论》07:递归视角下的选择排序与归并排序
java·数据结构·c++·python·程序人生·算法·排序算法
csdn_aspnet1 天前
javascript 算法 LeetCode 编号 70 - 爬楼梯
开发语言·javascript·算法·leetcode·ecmascript
shehuiyuelaiyuehao1 天前
多线程入门
java·python·算法