最大子矩陣-動態(tài)規(guī)劃

最近看DP的題目比較多采蚀,感覺真是遞歸之后的又一大神器啊。

題目是這樣的:http://ac.jobdu.com/problem.php?pid=1139

已知矩陣的大小定義為矩陣中所有元素的和迫卢。
給定一個矩陣,你的任務(wù)是找到最大的非空(大小至少是1 * 1)子矩陣。
比如智听,如下4 * 4的矩陣
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
的最大子矩陣是
9 2
-4 1
-1 8
這個子矩陣的大小是15根欧。

最開始我的分析是這樣的:要確定一個矩陣至少得4個元素怜珍,即4個角;或者起始坐標(biāo)以及長度寬度凤粗。我們可以遍歷每個頂點(diǎn)以及每種邊長绘面。
可是這樣的復(fù)雜度簡直是爆炸的。

直覺告訴我侈沪,只能用動態(tài)規(guī)劃了揭璃。
因為動態(tài)規(guī)劃可以把復(fù)雜的問題劃分成很小的部分。

那么問題來了亭罪,這個問題的子問題是什么瘦馍?

其實找到子問題是解題思路里面最重要的部分。

我們之前碰到的一個問題是应役,求一維數(shù)組里面的最大和情组。感覺這里可以用燥筷,又不知道怎么用。

我們上面說到了院崇,確定一個子矩陣得至少4個元素肆氓,那假設(shè)我們已經(jīng)知道了其中的兩個:
假設(shè)最優(yōu)解在第j行和第i行之間,剩下的就是去確定兩個列了底瓣。

  • 既然我們已經(jīng)把解的范圍局限在i谢揪,j兩行之間了,我們真的需要去求具體的哪一列嗎捐凭?

  • 先這樣看拨扶,如果i,j相等的話茁肠,也就是解在同一列患民。這樣的話,問題是不是就轉(zhuǎn)換為求一維數(shù)組的最大和了呢垦梆?

  • 擴(kuò)展到一般情況:i匹颤,j不想等:比如兩行為:
    1 2 -3 -4
    -5 7 2 3
    那么我們?nèi)绾吻竽兀?br> 降維!
    我們把每一列壓縮為一個數(shù)托猩,然后求一維的最大和就ok了印蓖。

整理一下思路:

1,我們遍歷所有的 行 的組合情況站刑,即第i行到第j行的所有情況另伍。
2,然后對每個組合之間的兩行之間的元素求這一列的值
3绞旅,對一個一維的和數(shù)組求最大和
4摆尝,對上述的最大和求最大值

在具體實現(xiàn)的時候,我們定住第i行不動因悲,移動第j行堕汞,然后不斷的求兩行之間的每一列的和(壓縮)。
然后在每次移動i的時候晃琳,我們清空儲存列的和的數(shù)組讯检。

程序:

//我們有第i行到第j行,然后求出每一列的從i到j(luò)的和卫旱,轉(zhuǎn)化為一維數(shù)組人灼,然后求這個數(shù)組的最大和
#include <iostream>
#include <cstring>
int maxSubArray(int* a,int n)//一維數(shù)組的最大和
{
    if(!a||n<=0)
        return 0;
    int curmax=0,max=0;
    max=curmax=a[0];
    for(int i=1;i<n;i++)
    {
        if(curmax>=0)
        {
            curmax+=a[i];
        }
        else 
            curmax=a[i];
        if(curmax>max)
            max=curmax;
    }
    return max;
 } 
 
 int maxSumInMatrix(int a[200][200],int n)
 {
    int i=0,j=0,k=0;
    int sumij[200]={0};//從i到j(luò)的每一列的和
    
    int max_n=a[0][0],max=a[0][0];
    
    for(i=0;i<n;i++)
    {
        memset(sumij,0,sizeof(sumij));//clear,每次移動i的時候清除
        for(j=i;j<n;j++)
        {
            
            for(k=0;k<n;k++)
            {
                sumij[k]+=a[j][k];
             }
             max_n=maxSubArray(sumij,n);
             if(max_n>max)//檢查并更新最大值
             max=max_n;
         }       
     }
     return max;
}
 
 int main()
 {
    int a[200][200];
    memset(a,0,sizeof(a));
    int n;
    std::cin>>n;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        std::cin>>a[i][j];
     }
     std::cout<<maxSumInMatrix(a,n);
 }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末顾翼,一起剝皮案震驚了整個濱河市投放,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌适贸,老刑警劉巖灸芳,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件涝桅,死亡現(xiàn)場離奇詭異,居然都是意外死亡烙样,警方通過查閱死者的電腦和手機(jī)冯遂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谒获,“玉大人蛤肌,你說我怎么就攤上這事【糠矗” “怎么了寻定?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵儒洛,是天一觀的道長精耐。 經(jīng)常有香客問我,道長琅锻,這世上最難降的妖魔是什么卦停? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮恼蓬,結(jié)果婚禮上惊完,老公的妹妹穿的比我還像新娘。我一直安慰自己处硬,他們只是感情好小槐,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著荷辕,像睡著了一般凿跳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上疮方,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天控嗜,我揣著相機(jī)與錄音,去河邊找鬼骡显。 笑死疆栏,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的惫谤。 我是一名探鬼主播壁顶,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼溜歪!你這毒婦竟也來了若专?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤痹愚,失蹤者是張志新(化名)和其女友劉穎富岳,沒想到半個月后蛔糯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡窖式,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年蚁飒,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片萝喘。...
    茶點(diǎn)故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡淮逻,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出阁簸,到底是詐尸還是另有隱情爬早,我是刑警寧澤,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布启妹,位于F島的核電站筛严,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏饶米。R本人自食惡果不足惜桨啃,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望檬输。 院中可真熱鬧照瘾,春花似錦、人聲如沸丧慈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽逃默。三九已至鹃愤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間笑旺,已是汗流浹背昼浦。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留筒主,地道東北人关噪。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像乌妙,于是被迫代替她去往敵國和親使兔。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評論 2 353

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