POJ 2479的簡單想法

2022-08-05 18:30:15 字數 928 閱讀 2984

這道題是簡單的dp例題拓展,問題是:給定一行數字,然後求這行數字中兩個連續子序列和的最大值,並輸出(兩個子序列不能有重疊的部分);

由於是初學者,可能想法比較侷限。我的總體思路是這樣:這題肯定和最大求子序列有關,然後進行工作:用dp1[i]表示以第i個數結尾的最大子序列的和,用dp[i]表示已第i個數為起點的最大子序列的和;這樣對於兩個子序列和的最大值,把n分成2部分,[0-j],(j,n)在這兩部分分別求dp1[i]得最大值和dp2[i]的最大值。這樣的話,所取到的兩個子序列一定不會有重合部分;

如何dp1[i],dp2[i]的最大值都[0,j],(j,n)這樣的區間算的話,時間複雜度就是o(n^2),這樣,我提交了試了一下,結果是tlo;然後我優化了一下:用陣列max1[i]表示前i個數中dp1[j]的最大值,max2[i]表示後(i,n)中dp2[j]的最大值;

這樣時間複雜度變為o(n),是不會超時的。下面是**:

#include

#include

using namespace std;

int a[60000];

int dp1[60000],dp2[60000],max1[60000],max2[60000];

int main()

else dp1[j]=a[j];

}dp2[n-1]=a[n-1];

for(int j=n-2;j>=0;j--)

else dp2[j]=a[j];

}max1[0]=dp1[0];

for(int j=1;jdp1[j]?max1[j-1]:dp1[j]);

}max2[n-1]=dp2[n-1];

for(int j=n-2;j>=0;j--)

int max=-400000;

for(int j=1;jprintf("%d\n",max);

}return 0;

}

Maximum sum(poj 2479)

題意 給一段數列,將這個數列分成兩部分,使兩部分的最大子段和的和最大,輸出和 看資料沒想到是 o n的演算法,求出從前向後的最大子段和和從後向前的最大子段和, 然後列舉斷點。 第一次提交不小心折在陣列最小值的賦值上 include include include define m 50010 defi...

poj 2479 maximum sum

題目大意 一個數列an,求max ap aq ai aj p q 思路 dp 設兩個dp陣列,分別表示1 i的最大子段和,i n的最大子段和,最後列舉i可得答案 在求這兩個dp陣列時,先讓它們表示已i為結尾的左右側最大子段和 然後dp i max dp i 1 dp i 求得dp陣列 include...

關於12306的想法

最初的想法是這樣, 12306如果做成這樣 這樣就沒有搶票這回事了,因為使用者完全無法干預排隊的事情。 後來追加的,考慮按比例分票 網路售票...