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

题目:

leetcode:1031. 两个非重叠子数组的最大和(dp)_第1张图片

分析:

leetcode:1031. 两个非重叠子数组的最大和(dp)_第2张图片
写了一个多小时的代码,
因为连这都搞混了:
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;

你可能感兴趣的:(动态规划)