POJ 2593解题报告
題目來源 :PKU 2593
http://acm.pku.edu.cn/JudgeOnline/problem?id=2593
?
?
解法類型 :動態規劃應用
?
?
作??? 者 :劉亞寧
?
題目大意:
??????? 抽取一個整數序列的兩個子序列,求所有抽取方法中得到兩個序列和的最大值。
?
?
題目思路:
???????? 用兩個數組數組記錄從前和從后子序列加和的最大值,每個元素的值為從前(后)加和至該位置得到的最大值。
???????? 遍歷數組每個位置,找出所有位置為分界點的最大值即為結果。
???????? 其中得到子序列最大和過程比較特殊,詳見代碼。
?
?
提交情況:
???????? Run time error(以后簡稱rte)一次:數組不夠大,省題沒注意數據范圍。
???????? Time Limit Exceeded(以后簡稱tle)一次:沒有應用前和后的數組進行數據的存儲。
?
?
注意:
???????? 兩個子序列和的最大值 不是最大子序列和 與 第二大不想交子序列和 的sum(錯因:例如數據3、 3、 -3、 4、 -2、 1)
?
?
源程序:
#include <iostream>
#define MIN -2000000000
using namespace std;
?
long a[110000],front[110000],back[110000];
?
int main()
{
???????? long num,i,r,k;
???????? while(cin>>num,num)
???????? {
?????????????????? for(i=1;i<=num;i++) cin>>a[i];
?????????????????? front[0]=MIN;//特殊處理邊界情況
?????????????????? back[num+1]=MIN;
?????????????????? for(i=1;i<=num;i++)
?????????????????? {
??????????????????????????? k=(front[i-1]+a[i])>a[i]?(front[i-1]+a[i]):a[i];
??????????????????????????? front[i]=front[i-1]>k?front[i-1]:k;//從前向后,找到加上a對應位置的值、不加該值、和只有該值(可能是一序列的開頭)的最大者,記錄于front數組
?????????????????? }
?????????????????? for(i=num;i>=1;i--)
?????????????????? {
??????????????????????????? k=(back[i+1]+a[i])>a[i]?(back[i+1]+a[i]):a[i];
??????????????????????????? back[i]=back[i+1]>k?back[i+1]:k;
?????????????????? }//從后向前,進行類似的活動
?????????????????? r=MIN;
?????????????????? for(i=1;i<num;i++)
??????????????????????????? if(front[i]+back[i+1]>r) r=front[i]+back[i+1];//從 所有前后兩個序列的分界位置 所對應的和中 找到最大的 即為結果
?????????????????? cout<<r<<endl;
???????? }
???????? return 0;
}
轉載于:https://www.cnblogs.com/goodness/archive/2010/03/05/1678874.html
總結
以上是生活随笔為你收集整理的POJ 2593解题报告的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 联合索引(多列索引)[通俗易懂]
- 下一篇: 常用扩流电路分析