Skip to content

掃瞄線演算法

掃瞄線演算法

P-4-13. 最大連續子陣列

輸入一個整數陣列 A[1:n],請計算 A 的連續子陣列的最大可能總和,空陣列的和以
0 計算。
Time limit: 1 秒
輸入格式:第一行是正整數 n,第二行有 n 整數 A[1], A[2], …, A[n]。n 不超
過 1e5,陣列內容絕對值不超過 1e9。
輸出:最大可能總和。

範例一輸入:
8
4 12 -17 5 8 -2 7 -3

範例一輸出:
18

範例二輸入:
3
-1 -1 -1

範例二輸出:
0

  1 2 3     -6 2 -3    -3 6 9
| =6 需要 | =-7 不需要| =12 需要

我們可以把每個區間看成一個部分,如果這個區間是正的,代表我們需要他

d784. 一、連續元素的和

考慮要不要前面
#include <iostream>
using namespace std;
#define nn "\n"
#define N 1000

int main(){
    int w;
    cin>>w;
    while(w--){
        int n;
        cin>>n;
        int dp[N];
        int ans=-100000;
        cin>>dp[0];
        if(dp[0]<0){
            dp[0]=0;
        }
        for(int i=1;i<n;i++){
            cin>>dp[i];
            if(dp[i-1]>0){
                dp[i]+=dp[i-1];//前面是有用的才拿
            }
            ans=max(ans,dp[i]);
        }
        cout<<ans<<nn;
    }
}
考慮選、不選
#include <iostream>
using namespace std;
#define nn "\n"
#define N 1000

int main(){
    int w;
    cin>>w;
    while(w--){
        int n;
        cin>>n;
        int dp[N];
        int ans=-100000;
        cin>>dp[0];
        if(dp[0]<0){
            dp[0]=0;
        }
        for(int i=1;i<n;i++){
            cin>>dp[i];
            dp[i]+=dp[i-1];
            ans=max(ans,dp[i]);
            dp[i]=max(dp[i],0);
        }
        cout<<ans<<nn;
    }
}