hdu1231 最大字段和

這道題目曾經困擾我很久,覺得自己的程序應該沒什麼問題卻老是WA,測試用例全部能通過,今天重新寫了一遍 另外對全負數的情況進行了專門的處理 一次就AC了 開始有點困惑,現在一看前面的邏輯還真有點荒唐

 

AC代碼:

#include<iostream>
using namespace
std;
int
num[10000];

int
spacial(int n)
{

    int
tag=1;
    for
(int i=0;i<n;i++)
        if
(num[i]>=0)
        {

            tag=0;
            break
;
        }

    return
tag;
}


void
find_max(int &low,int &high,int &max,int n)
{

    int
from,sum;
    from=sum=0;
    for
(int i=0;i<n;i++)
    {

        if
(num[i]+sum>max){max=sum+=num[i],low=from,high=i;}
        else if
(num[i]+sum>0){sum+=num[i];}
        else
{sum=0;from=i+1;}
    }
}



int
main()
{

    int
n;
    while
(cin>>n&&n)
    {

        for
(int i=0;i<n;i++)cin>>num[i];
        if
(spacial(n))cout<<0<<" "<<num[0]<<" "<<num[n-1]<<endl;
        else

        {

            int
low,high,max;
            low=high=0;max=-1;
            find_max(low,high,max,n);
            cout<<max<<" "<<num[low]<<" "<<num[high]<<endl;

        }
    }

    return
0;
}

經典dp題目,思路還是蠻自然的, 這種狀態轉換不需要特別的知識直觀很容易想到,看看以前的錯誤版本還是沒有很好地處理全負數的情況,此時返回的maxnum肯定是負數,也只有全負數的情況返回一個負數,直接分類處理輸出就ok了

不過乾脆 單獨處理這種情況更清晰

下面貼出一個錯誤版本

#include <iostream>
using namespace std;
int
number[10000];
int
main()
{

   
    int
n,num;
    while
(cin>>n&&n)
    {

        int
sum=0,MaxSum=-100000000,start,end,from,to;
        for
(int i=1;i<=n;i++)
        {

            cin>>num;
            number[i]=num;
        }

        from=number[1];
        for
(int j=1;j<=n;j++)
        {

            sum+=number[j];
            to=number[j];
            if
(sum>MaxSum)
            {

                MaxSum=sum;
                start=from;
                end=to;
            }

            if
(sum<=0)
            {

                sum=0;
                if
(j<n)from=number[j+1];                       
            }

//             if (MaxSum<0)//元素全負
//             {
//             }
        }
        cout<<MaxSum<<" "<<start<<" "<<end<<endl;                            
    }

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章