動態規划 最大連續子段和


子段與子段和的概念:

  給定一個由數字組成的序列,其中一段連續的序列稱為一個子段(假設非空),子段中所有的數字和就是為 子段和


例子:

   {1,2,3,4} ,

   連續子段有 {1} {1,2} {1,2,3} {1,2,3,4} {2,3} {2,3,4} {3,4} {4}

 

O(n2) 枚舉的做法:

    for(int i=0;i<n;++i){
        long sum = 0;
        for(int j=i;j<n;++j){
            sum += a[j];
            if(sum > nMax){
                nMax = sum;
            }
        }
    }

 

通過觀察發現。

(1) 整個序列都是負數,那么 最大子段和 為 最小的負數 。

(2) 如果都是正數,那么 最大子段和 就是 整個序列的的和。

(3) 如果有正有負,那么 最大的子段和 >= 整個序列的最大值,

          那么我們可以假設一個變量sum = 0; 來記錄當前的子段和。

          ans 記為 整個序列的最大值

          因為要得到最大的子段 假設{ n1,n2,n3 },那么這個子段前綴 {n1,n2} 一定不會 < 0

          要得到 更大的子段和,我們就不會用 < 0 的子段和 來 拖累 后面的子段和。

          用 ans = max(ans , sum)。來求出結果

 

O(n) 動態規划實現代碼:

#include <iostream>
#include <algorithm>
using namespace std;
const int inf = 0x7fffffff;
int num[101];
int main() {
    int N;
    cin >> N;
    for(int i=0;i<N;i++){
        cin >> num[i];
    }
    int ans = -inf;
    for(int i=0;i<N;i++){
        ans = max(ans,num[i]);
    }
    if(ans <= 0){
        cout << ans << endl;
    }else{
        int sum =0;
        for(int i=0;i<N;i++){
            if(sum + num[i] < 0){
                sum = 0;
            }else{
                sum += num[i];
            }
            ans = max(ans,sum);
        }
        cout << ans << endl;
    }
    return 0;
}

 

題目:

  HDU1087

題解:

#include <iostream>
#include <algorithm>
using namespace std;
int a[1001];
int dp    [1001]; 
const int INF = 0x3f3f3f3f;
int main(){
    int n;
    while(cin >> n&& n){
        for(int i=0;i<n;++i){
            cin >> a[i];
        }
        for(int i=0;i<n;++i){
            dp[i] = a[i];
            for(int j=0;j<i;++j){
                if(a[i] > a[j]){
                    dp[i] = max(dp[j] + a[i],dp[i]);
                }
            }
        }
        int maxN = a[0];
        for(int i=0;i<n;++i){
            maxN = max(maxN,dp[i]);
        }
        cout << maxN << endl;
    }

    return 0;
}
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM