DP練習 月餅盒(提高版)(vijos1255)

2021-10-04 20:48:25 字數 3116 閱讀 7125

【題目背景】:中秋節了,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 ...