1. 程式人生 > 其它 >【解題報告】洛谷P1115 最大子段和

【解題報告】洛谷P1115 最大子段和

【解題報告】洛谷P1115 最大子段和

題目連結

https://www.luogu.com.cn/problem/P1115

思路

我們有兩種方法

  1. 貪心

我們一直輸入,然後一直加法,如果 \(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;
}
  1. 動態規劃

實際上就是貪心吧

我們設 \(f[i]\) 表示從1到 \(i\) 的最大欄位和

於是我們就有 \(f[i]=max(f[i-1]+a[i],a[i])\)

然後我們用一個滾動陣列滾一下,然後就變成貪心了

別人的程式碼

#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;
}
本博文為wweiyi原創,若想轉載請聯絡作者,qq:2844938982