LineSounds 2023-08-10 16:40 采纳率: 100%
浏览 11
已结题

关于求最大子列和并输出前后两端问题


#include <iostream>
using namespace std;
void maxsum(int p[],int numb){
int i,j,front,back;
int ThisSum,MaxSum1;
ThisSum=MaxSum1=0;
for(i=0,j=p[i];i<numb;i++){
ThisSum+=p[i];
if(ThisSum>MaxSum1){
MaxSum1=ThisSum;
front=j;
back=p[i];
}else if(ThisSum<0){
    ThisSum=0;
    j=p[i+1];
}
}
cout<<MaxSum1<<" "<<front<<" "<<back;
}
int main(){
int num;
cin>>num;
int *p=new int[num];
int number=num;
while(num){
cin>>p[num-1];
num--;
}
maxsum(p,number);
delete p;
return 0;
}

10
-10 1 2 3 4 -5 -23 3 7 -21输入
预期结果10 1 4
代码实际结果10 7 3
这样记录前后两端数字有什么问题

  • 写回答

3条回答 默认 最新

  • mengxinmengxin12 2023-08-10 17:10
    关注

    希望采纳

    
    
    ```c++
    #include<iostream>
    #include<algorithm>
    using namespace std;
    const int N=1e5+10;
    int dp[N],bg[N],idx;
    int main()
    {
        int n;
        cin>>n;
        for(int i=1;i<=n;i++)
        cin>>dp[i];
        int maxx=-1e9;
        for(int i=1;i<=n;i++)
        {
            if(dp[i-1]>0)
            {
                dp[i]=dp[i-1]+dp[i];
                bg[i]=bg[i-1];
            }
            else
            {
                bg[i]=i;
            }
            if(maxx<dp[i])
            {
                maxx=dp[i];
                idx=i;
            }
    //        cout<<dp[i]<<endl;
        }
        cout<<dp[idx]<<" "<<bg[idx]-1<<" "<<idx-1<<endl;
        return 0;
    }
    /*
    10
    -10 1 2 3 4 -5 -23 3 7 -21
    */
    
    

    ```

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 8月19日
  • 已采纳回答 8月11日
  • 创建了问题 8月10日