leetcode:1031. 两个非重叠子数组的最大和(dp)

题目:

在这里插入图片描述

分析:

在这里插入图片描述
写了一个多小时的代码,
因为连这都搞混了:
1.到i为止的最大和
2.包含i的最大和

代码:

 if(L+M==A.size()) return accumulate(A.begin(),A.end(),0);
 //A1[i] 表示到i位置的连续L个最大和。
 vector<int> A1(A.size(),-(1<<29));
 A1[L-1]=accumulate(A.begin(),A.begin()+L,0);
 for(int i=L;i<A.size();i++)
 {
  A1[i]=A1[i-1]+A[i]-A[i-L];
 }
 //A2[i] 表示到i位置的连续M个最大和。 
 vector<int> A2(A.size(),-(1<<29));
 A2[M-1]=accumulate(A.begin(),A.begin()+M,0);
 for(int i=M;i<A.size();i++)
 {
  A2[i]=A2[i-1]+A[i]-A[i-M];
 }
 //A3[i] 表示到i位置的连续L个最大和。   ---逆着 
 vector<int> A3(A.size(),-(1<<29));
 A3[A.size()-L]=accumulate(A.end()-L,A.end(),0);
 for(int i=A.size()-L-1;i>=0;i--)
 {
  A3[i]=A3[i+1]+A[i]-A[i+L];
 }
 //A4[i] 表示到i位置的连续M个最大和。   ---逆着 
 vector<int> A4(A.size(),-(1<<29));
 A4[A.size()-M]=accumulate(A.end()-M,A.end(),0);
 for(int i=A.size()-M-1;i>=0;i--)
 {
  A4[i]=A4[i+1]+A[i]-A[i+M];
 }
 int maxx=-(1<<30);
 for(int i=1;i<A.size();i++)
 {
  maxx=max(maxx,A1[i-1]+A4[i]);
 }
 for(int i=1;i<A.size();i++)
 {
  maxx=max(maxx,A2[i-1]+A3[i]);
 }
 for(int i=0;i<A.size();i++) cout<<A1[i]<<' ';
 cout<<endl; 
 for(int i=0;i<A.size();i++) cout<<A2[i]<<' ';
 cout<<endl;
 for(int i=0;i<A.size();i++) cout<<A3[i]<<' ';
 cout<<endl;
 for(int i=0;i<A.size();i++) cout<<A4[i]<<' ';
 cout<<endl;
 return maxx;
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值