【題目背景】:中秋節了,ccc老師決定去送禮。
【問題描述】:乙個被分為 n*m 個格仔的月餅盒,第 i 行第 j 列位置的格仔裡面有 a [ i , j ]個月餅。本來ccc老師打算送這盒月餅給某人的,但是就在要送出月餅盒的前一天晚上,乙隻極其可惡的老鼠夜襲月餅盒,有部分格仔被洗劫並且穿了洞。ccc老師必須盡快從這個月餅盒裡面切割出乙個矩形月餅盒,新的月餅盒不能有洞,並且ccc老師希望保留在新月餅盒內的月餅的總數盡量多。
【題目任務】:請幫ccc老師設計乙個程式 計算一下新月餅盒最多能夠保留多少月餅。
【檔案輸入】第一行有兩個整數 n、m。第 i + 1 行的第 j 個數表示 a [ i , j ],如果這個數為 0 ,則表示這個位置的格仔被洗劫過。其中:1 ≤ n,m ≤ 300 , 0 ≤ a [ i , j ]≤ 255
【檔案輸出】:輸出最大月餅數
【樣例輸入】
3 41 2 3 4
5 0 6 3
10 3 4 0
【樣例輸出】
ps:對於40%的資料,n ,m≤80
對於60%的資料,n ,m≤400
對於100%的資料,n,m≤1000
題目大意說的很清楚,其中有兩個限制條件:
1、切割出來的需要是乙個矩形
2、切割出來的矩形裡不能有為0的數
首先我們要想的是怎麼去切割矩形,這個我們不妨把思路轉換一下,讓我們來想想乙個矩形應該是怎麼的出來的?
矩形的構成有兩大要素,長和寬,說到這裡大家應該有點思路了吧?
沒錯,有兩種方式可以來構建乙個矩形
(1)先確定長,然後不斷延伸它的寬
(2)先確定寬,然後延伸它的長
這道題我們便可以利用這個思路來解題。
下面我們來分析一下:
假設我們當前遍歷到a[0][0],即剛剛開始
1.從a[0][0]出發,向右遍歷(注意:我們只需要向右遍歷),確認從當前位置出發,所能得到最大的長(遍歷到0或者到邊界則停止,進入下一步),以此作為矩形的長,我們得到了它的最大長為4,即從a[0][0]-->a[0][3]
2.我們以這個長為中心,上下延伸矩形的寬,可分兩步來
(1)往上延伸,遇到0或到達邊界則返回,否則繼續向上擴充套件。在例子中,我們往上延伸,第一次就達到了邊界,,因此直接返回,往上擴充套件的寬度為0。
(2)往下延伸,遇到0或到達邊界則返回,否則繼續向下擴充套件。在例子中,我們向下延伸,在第一次就遇到了0,因此直接返回,向下延伸的寬度為0。
3.這個時候,就得到了我們想要的矩形了,此時我們在將矩形中資料的和與當前記錄的最大值作比較,如果大於最大值則替換最大值。
我們以另一起點再來分析模擬一遍,假設我們當前遍歷到了a[1][2],如下圖:
1.我們以a[1][2]為起點,向右遍歷(注意:我們只需要向右遍歷),確認從當前位置出發,所能得到最大的長(遍歷到0或者到邊界則停止,進入下一步),以此作為矩形的長,我們得到了它的最大長為2,即從a[1][2]-->a[1][3]
2.我們以這個長為中心,上下延伸矩形的寬,還是分兩步來
(1)往上延伸,遇到0或到達邊界則返回,否則繼續向上擴充套件。在例子中,我們往上延伸,第一次發現可以滿足要求,此時寬+1,繼續往上延伸,達到了邊界,,因此直接返回,往上擴充套件的寬度為1。
當前的矩形如圖:
(2)往下延伸,遇到0或到達邊界則返回,否則繼續向下擴充套件。在例子中,我們向下延伸,在第一次就遇到了0,因此直接返回,向下延伸的寬度為0。
3.這個時候,就得到了我們想要的矩形了,此時我們在將矩形中資料的和與當前記錄的最大值作比較,如果大於最大值則替換最大值。
//往上擴充套件
int searchup(int miny,int maxy,int x)
return sum+searchup(miny,maxy,x-1);
}//往下擴充套件
int searchdown(int miny,int maxy,int x)
return sum+searchdown(miny,maxy,x+1);
}int main()
}} }
printf("%d\n",max);
return 0;
}
DP練習 月餅盒(提高版)
題目背景 中秋節了,did老師決定去送禮。問題描述 乙個被分為 n m 個格仔的月餅盒,第 i 行第 j 列位置的格仔裡面有 a i j 個月餅。本來did老師打算送這盒月餅給某人的,但是就在要送出月餅盒的前一天晚上,乙隻極其可惡的老鼠夜襲月餅盒,有部分格仔被洗劫並且穿了洞。did老師必須盡快從這個...
區間DP練習
部落格 lightoj 1422 int dp 105 105 a 105 dp i j i 到 j 最小穿多少衣服 int main printf d n dp 1 n return 0 poj2955括號匹配 int dp 105 105 a 105 dp i j i 到 j 匹配了多少括號。i...
數字DP練習
數字dp模板 hdu2089 不要62 題意 求區間中不含62且不含4的數的個數 include include includeusing namespace std int dp 20 10 int a 20 sta 記錄上一位數是否是6 int dfs int pos,int sta,bool ...