【51nod】最大子段和
題面
以一個長為n的數列,求連續子段的最大值。
思路1
直接列舉O(n^3)TLE穩穩的
#include<iostream>
using namespace std;
int n, a[50050], ans;
int main(){
cin>>n;
for(int i = 1; i <= n; i++)cin>>a[i];
for(int i = 1; i <= n; i++){//列舉起點
for(int j = i; j <= n; j++){//列舉終點
int t = 0;
for(int k = i; k <= j; k++){//區間統計
t += a[k];
}
ans = max(ans, t);//更新最值
}
}
cout<<ans<<"\n";
return 0;
}
字首和優化的列舉法,O(N^2),還是TLE
#include<iostream>
using namespace std;
int n, a[50050], ans;
int main(){
cin>>n;
for(int i = 1; i <= n; i++){ cin>>a[i]; a[i]+=a[i-1];}
for(int i = 1; i <= n; i++)//列舉起點
for(int j = i; j <= n; j++)//列舉終點
ans = max(ans, a[j]-a[i-1]);//更新最值
cout<<ans<<"\n";
return 0;
}
思路2
分治。以中間元素為基準,向左求出以中間元素為尾的最大子段和,向右求出以中間元素為首的最大子段和,兩部分相加即橫跨左右兩部分的最大子段的和,三者最大即為答案。複雜度O(nlogn),可以水過,記得不開longlong會WA。
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long LL;
int n, a[50050];
LL dfs(int l, int r){
if(l==r)return a[l]>0?a[l]:0;//所給整數均為負數時和為0。
else{
int m = l+r>>1;
LL ls = dfs(l,m), rs = dfs(m+1,r);//左右兩段單獨
//跨中間
LL lsum = 0, lmax = 0;
for(int i = m; i >= l; i--){
lsum += a[i];
lmax = max(lmax, lsum);
}
LL rsum = 0, rmax = 0;
for(int i = m+1; i <= r; i++){
rsum += a[i];
rmax = max(rmax, rsum);
}
return max(lmax+rmax,max(ls,rs));
}
}
int main(){
cin>>n;
for(int i = 1; i <= n; i++)cin>>a[i];
cout<<dfs(1,n)<<"\n";
return 0;
}
思路3
DP(覆蓋了所有狀態),如果當前記錄的子段的和為負數時,就要以下一個點為起點重新找子段了。複雜度O(n),AC穩穩的。
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long LL;
int n, a[50050];
int main(){
cin>>n;
for(int i = 1; i <= n; i++)cin>>a[i];
LL ans=0, t=0;
for(int i = 1; i <= n; i++){
if(t > 0)t += a[i];
else t = a[i];
ans = max(ans, t);
}
cout<<ans<<"\n";
return 0;
}
相關文章
- 51nod 1254 最大子段和 V2
- 山海經:線段樹維護最大子段和
- 最大連續子陣列和(最大子段和)陣列
- 動態規劃求解最大子段和 (兩種寫法+還原最優解)動態規劃
- 【線段樹提高】51nod &&洛谷
- 動態規劃---例題3.最大子段和問題動態規劃
- 分治法 && 動態規劃 洛谷P1115 最大子段和動態規劃
- 順序表應用7:最大子段和之分治遞迴法遞迴
- 51nod 1274 最長遞增路徑
- 51Nod 1006 最長公共子序列Lcs
- 順序表應用8:最大子段和之動態規劃法動態規劃
- Hetao P1156 最大戰力 題解 [ 綠 ][ 二分 ][ 最大子段和 ]
- 洛谷題單指南-常見最佳化技巧-P1115 最大子段和
- 最大子列和問題
- leetcode_最大子序和LeetCode
- 53. 最大子陣列和陣列
- [Python手撕]最大子陣列和Python陣列
- LeetCode53. 最大子陣列和LeetCode陣列
- [-演算法篇-] 最大子序列和演算法
- 【力扣】最大子陣列和(貪心)力扣陣列
- 53. 最大子序和(python3)Python
- 51nod 1204 Parity
- 51nod“省選”模測第二場 C 小朋友的笑話(線段樹 set)
- 53. 最大子序和(劍指 Offer 42)
- 2021-01-03 | 53. 最大子序和
- 授勳 51Nod - 3216
- 【刷演算法】LeetCode.53-最大子序和演算法LeetCode
- 51nod 3188 字元王國字元
- 51nod 1366 貧富差距
- 【刷題筆記】LeetCode-53 最大子陣列和筆記LeetCode陣列
- 求二維陣列中最大子陣列的和陣列
- 51nod 1202 子序列個數
- 51nod 3145 扔球遊戲遊戲
- ●51NOD 1705 七星劍
- #1502 : 最大子矩陣矩陣
- 【LeetCode】【分治法】連續數列(最大子序和)思路解析和程式碼LeetCode
- 從0打卡leetcode之day 3 -- 最大子序列和LeetCode
- 最大雙子段和