PAT (Advanced Level) 1007 Maximum Subsequence Sum(最大连续子段和)
生活随笔
收集整理的這篇文章主要介紹了
PAT (Advanced Level) 1007 Maximum Subsequence Sum(最大连续子段和)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接:點擊查看
題目大意:求最大連續子段和,并輸出其第一項和最后一項,若結果為負數,輸出0,以及數組的第一項和最后一項
題目分析:簡單動態規劃,幫我復習了一下這種題目該怎么做。。動態規劃一直是我的弱項,所以借此鞏固一下基礎,還有就是,英語不好真難受,或者說是自己太想當然了,看到這個題目的第一眼,先看了一眼題目,是要求最大連續子段和,然后看了一眼樣例,以為是需要輸出結果,以及首項的位置和尾項的位置,興致勃勃的寫了一發交上去,只過了一個樣例??當時我就自閉了,感覺自己寫的沒問題,不管怎么改還是錯,去網上看了一眼題解,發現是需要輸出首項的值和尾項的值,而不是位置。。看到這個我都快哭了,改了半天竟然還是敗在了英語上,隨便一改交上去就A了。。
就是一個模板題,線性求最大連續子段和,也不用數組記錄,在線求就行了,記得記錄一下第一項和最后一項,最后萬一答案是負數的時候可以直接輸出了
相當于掛個模板吧,代碼:
#include<iostream> #include<cstdlib> #include<string> #include<cstring> #include<cstdio> #include<algorithm> #include<climits> #include<cmath> #include<cctype> #include<stack> #include<queue> #include<list> #include<vector> #include<set> #include<map> #include<sstream> #include<unordered_map> using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=110;int main() { // freopen("input.txt","r",stdin);int n;scanf("%d",&n);int mmax=-inf;//子序列之和int ans=-inf;//最大子序列之和int st,ed,temp;//最大子序列的首項、尾項,以及輔助記錄首項的tempint first,last;//整個數組的首項和尾項for(int i=1;i<=n;i++){int num;scanf("%d",&num);if(i==1)first=num;if(i==n)last=num;if(num>mmax+num)//若子序列之和變為負數,直接舍棄{mmax=num;temp=num;//記錄一下當前子序列的起點}else//否則繼續記錄mmax+=num;if(mmax>ans)//若當前子序列之和大于最大子序列之和,則更新答案{ans=mmax;st=temp;//順便更新一下當前子序列的起點ed=num;//以及當前的num為終點}}if(ans<0)//分情況輸出cout<<0<<' '<<first<<' '<<last<<endl;elsecout<<ans<<' '<<st<<' '<<ed<<endl;return 0; }?
總結
以上是生活随笔為你收集整理的PAT (Advanced Level) 1007 Maximum Subsequence Sum(最大连续子段和)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PAT (Advanced Level)
- 下一篇: PAT (Advanced Level)