【解題報告】洛谷P1115 最大子段和
阿新 • • 發佈:2021-10-11
【解題報告】洛谷P1115 最大子段和
題目連結
https://www.luogu.com.cn/problem/P1115
思路
我們有兩種方法
- 貪心
我們一直輸入,然後一直加法,如果 \(sum < 0\) 就說明這是不合法的,從頭再來,我們邊記錄,邊加法,然後最後記錄到的最大值就是 \(ans\) 記錄的值了
#include <iostream> #include <cstdio> #include <algorithm> #include <string> #include <cstring> using namespace std; int n; int ans=-999; int main() { std::ios::sync_with_stdio(false); cin>>n; int sum=0; for(int i=1;i<=n;i++) { int a; cin>>a; sum+=a; ans=max(ans,sum); if(sum<0) sum=0; } cout<<ans<<endl; return 0; }
- 動態規劃
實際上就是貪心吧
我們設 \(f[i]\) 表示從1到 \(i\) 的最大欄位和
於是我們就有 \(f[i]=max(f[i-1]+a[i],a[i])\)
然後我們用一個滾動陣列滾一下,然後就變成貪心了
別人的程式碼
本博文為wweiyi原創,若想轉載請聯絡作者,qq:2844938982#include<bits/stdc++.h> using namespace std; int main() { int n[200001],p,ans[200001]={0}; int sum=-9999999;//|x|<=10000 QWQ cin>>p; for(int i=1;i<=p;i++) { cin>>n[i];//輸入 ans[i]=max(ans[i-1]+n[i],n[i]);//DP sum=max(sum,ans[i]);//取最大值也同時進行,節約時間 } cout<<sum;//直接輸出 return 0; }