動(dòng)態(tài)規(guī)劃---最大字段和

引言:在牛課網(wǎng)刷題時(shí)遇到好多次使用動(dòng)態(tài)規(guī)劃求解最大字段和類似的問題茵瘾,但是每一次都毫無頭緒箱熬,今天趁著復(fù)習(xí)算法央串,將最大字段和好好的腹瀉了一遍:下面是自己的一些簡(jiǎn)單的筆記:
一:?jiǎn)栴}描述:

給定n個(gè)整數(shù)(可能為負(fù)整數(shù))組成的序列a1,a2,a3…..an举反。求該序列如同
的子段和的最大值

公式.png

的值。
二:解法:
1:暴力解法:列出所有的可能性:

/**
     * 三次循環(huán)的方式:
     * 時(shí)間復(fù)雜度為O(n^3)
     * 這種情況是分別計(jì)算從第一數(shù)開始一直加到最后一個(gè)數(shù)的最大值記錄下來
     * 再從第二個(gè)數(shù)開始一直加到最后一個(gè)數(shù)將最大值保存下來指巡;
     * .....
     * 一直到最后只剩最后一個(gè)數(shù)淑履;
     * @param arr
     * @param n
     * @param l
     * @param r
     * @return
     */
    public static int MaxSum(int[] arr,int n,int l,int r){
        int sum = 0;
        for(int i =0;i<n;i++){
            for(int j=i;j<n;j++){
                int temp = 0;
                for(int k=j;k<n;k++){
                    temp+=arr[k];
                    if(temp>sum){
                        sum=temp;
                        l=i;
                        r=j;
                    }
                }
            }
        }
        return sum;
    }

2:在1的基礎(chǔ)上優(yōu)化使其時(shí)間復(fù)雜度縮減至O(n^2)

     /**
     * @param arr       目標(biāo)數(shù)組
     * @param n         目標(biāo)數(shù)組的長(zhǎng)度
     * @param l     最終字段和的起點(diǎn)
     * @param r     最終字段和的終點(diǎn)
     * @return
     */
public int MaxSum(int[] arr,int n,int l,int r){
        int sum=0;
        for(int i=0;i<n;i++){
            int temp = 0;
            for(int j=i;j<n;j++){
                temp+=arr[j];
                if(temp>sum){
                    sum=temp;
                    l=i;
                    r=j;
                }
            }
        }
        return 0;                                                                                                                                                                                                                                                                                                                                                                                                                     
    }

3:使用分治法求解
如果將序列a[1:n]分為長(zhǎng)度相等的兩段a[1:n/2]和a[n/2+1:n];分別求這兩種情況下的最大字段和,則a[1:n]的最大字段和有3種情況:
A:a[1:n]的最大字段和與a[1:n/2]的最大字段和相等
B:a[1:n]的最大字段和與a[n/2+1:n]的最大字段和相等
C:a[1:n]的最大字段和為


求和.png

且1<=i<=n/2,n/2+1<=j<=n.
時(shí)間復(fù)雜度為O(nlogn)

/**
     * 使用分治法求解最大字段和
     * @param arr
     * @param left 序列的最左下標(biāo)
     * @param right 序列的最右下標(biāo)
     * @return
     */
    public int MaxSubSum(int arr[],int left,int right){
        int sum =0;
        if(left==right){
            sum = (arr[left]>0)?arr[left]:0;
        }else{
            int center = (left+right)/2;
              //遞歸求解左右邊序列的最大字段和
            int leftSum = MaxSubSum(arr, left, center);
            int rightSum = MaxSubSum(arr, center+1, right);
            //求左邊子序列的最大字段長(zhǎng)度
            int s1 =0;
            int lefts = 0;
            for(int i=center;i>=0;i--){
                lefts+=arr[i];
                if(lefts>s1){
                    s1 = lefts;
                }
            }
            //求右邊子序列的最大字段長(zhǎng)度
            int s2= 0;
            int rights = 0;
            for(int i=center+1;i<right;i++){
                rights+=arr[i];
                if(s2<rights){
                    s2=rights;
                }
            }
            sum = s1+s2;
            if(sum<leftSum){sum=leftSum;}
            if(sum<rightSum){sum=rightSum;}
        }
    
        return sum;
    } 

4:動(dòng)態(tài)規(guī)劃求解最大字段和:
僅僅在O(n)時(shí)間復(fù)雜度就可以將結(jié)果求出來藻雪;

/**
     * 
     * @param n 序列的長(zhǎng)度
     * @param arr 待求序列
     * @return
     */
    public static int MaxSums(int n,int arr[]){
        int sum = 0;
        //子序列
        int b = 0;
        for(int i=0;i<n;i++){
            if(b>0){
                b+=arr[i];
            }else{
                b=arr[i];
            }
            if(b>sum){
                sum=b;
            }
        }
        return sum;
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末秘噪,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子勉耀,更是在濱河造成了極大的恐慌指煎,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瑰排,死亡現(xiàn)場(chǎng)離奇詭異贯要,居然都是意外死亡暖侨,警方通過查閱死者的電腦和手機(jī)椭住,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來字逗,“玉大人京郑,你說我怎么就攤上這事宅广。” “怎么了些举?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵跟狱,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我户魏,道長(zhǎng)驶臊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任叼丑,我火速辦了婚禮关翎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘鸠信。我一直安慰自己纵寝,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布星立。 她就那樣靜靜地躺著爽茴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪绰垂。 梳的紋絲不亂的頭發(fā)上室奏,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音劲装,去河邊找鬼窍奋。 笑死,一個(gè)胖子當(dāng)著我的面吹牛酱畅,可吹牛的內(nèi)容都是我干的琳袄。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼纺酸,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼窖逗!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起餐蔬,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤碎紊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后樊诺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體仗考,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年词爬,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了秃嗜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖锅锨,靈堂內(nèi)的尸體忽然破棺而出叽赊,到底是詐尸還是另有隱情,我是刑警寧澤必搞,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布必指,位于F島的核電站,受9級(jí)特大地震影響恕洲,放射性物質(zhì)發(fā)生泄漏塔橡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一霜第、第九天 我趴在偏房一處隱蔽的房頂上張望谱邪。 院中可真熱鬧,春花似錦庶诡、人聲如沸惦银。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽扯俱。三九已至,卻和暖如春喇澡,著一層夾襖步出監(jiān)牢的瞬間迅栅,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來泰國(guó)打工晴玖, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留读存,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓呕屎,卻偏偏與公主長(zhǎng)得像让簿,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子秀睛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 回溯算法 回溯法:也稱為試探法尔当,它并不考慮問題規(guī)模的大小,而是從問題的最明顯的最小規(guī)模開始逐步求解出可能的答案蹂安,并...
    fredal閱讀 13,626評(píng)論 0 89
  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗(yàn)椭迎。 張土汪:刷leetcod...
    土汪閱讀 12,724評(píng)論 0 33
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)田盈,斷路器畜号,智...
    卡卡羅2017閱讀 134,599評(píng)論 18 139
  • 1 最近世界似乎處于一個(gè)非常無常動(dòng)蕩的時(shí)間里,邊境不斷摩擦允瞧,國(guó)內(nèi)多地連續(xù)暴雨傾城简软,嚴(yán)重影響人們出行蛮拔;美麗的九寨溝發(fā)...
    董禹闐閱讀 413評(píng)論 2 5
  • 當(dāng)愛第一次來敲我門時(shí),我還在賴床昏昏欲睡替饿,或許是來的太突然或許是太輕浮语泽,當(dāng)然這次我錯(cuò)過了 錯(cuò)過了第一次不要緊因?yàn)樗?..
    victory527閱讀 482評(píng)論 5 6