求n m網格內矩形的數目

2022-03-27 06:22:11 字數 1149 閱讀 1665

乙個n*m的網格,求這個網格中矩形的數目。

比如以下2*2網格,總共有9個矩形:4個1*1的矩形,4個1*2的矩形,1個2*2的矩形

演算法1:動態規劃,假設dp[i][j]表示以第 i 行第 j 列的格仔為右下角頂點的矩形數目,那麼dp[i][j] = 1 + dp[i-1][j] + dp[i][j-1] – dp[i-1][j-1] , 這裡的1表示i ,j 位置的格仔自身構成1*1的矩形,之所以減去dp[i-1][j-1], 因為dp[i-1][j] 和 dp[i][j-1] 都包含了dp[i-1][j-1]。計算時注意i = 1 和 j = 1的邊界條件。最後把所有dp[i][j]加起來就是我們所求的答案。以3*3網格舉例,為了計算方便,紅色為設定的邊界值,黑色的才是最後需要加起來的值(結果為36)

}演算法2:我們假設網格是1行m列的,那麼總的矩形數目 = m(1*1的矩形) + m-1(1*2的矩形) + m-2(1*3的矩形) +…+1(1*m的矩形) = m*(m+1)/2,同理n行1列總的矩形數目是n*(n+1)/2. 對於n*m的網格,我們可以先確定好選取的行數(即確定矩形的高),公共有n*(n+1)/2種選法,選好以後就可以壓縮成1行m列的網格來考慮了,因此總共n*(n+1)/2*m*(m+1)/2個矩形。(注意最後結果是否溢位int範圍)

int rectnum(int row, int column)

演算法2還可以這樣理解:兩個對角點就可以確定乙個矩形。對於乙個n*m的網格,總共有(n+1)*(m+1)個頂點,因此第乙個頂點有(n+1)*(m+1)種選取方法,選取好第乙個頂點後,第二個頂點就有一些限制了,它不能和第乙個頂點在同一條直線上,因此第二個頂點有n*m種選取方法;因此選取兩個頂點總共有(n+1)*(m+1)*n*m種選取方法,考慮到矩形abcd,選取ac、ca、bd、db都表示同乙個矩形,即這些選取方法中,包含的每個矩形都重複了四次,因此總共有(n+1)*(m+1)*n*m/4個矩形。

可以在hduoj 2524上測試演算法的正確性

求n m網格內矩形的數目

乙個n m的網格,求這個網格中矩形的數目。比如以下2 2網格,總共有9個矩形 4個1 1的矩形,4個1 2的矩形,1個2 2的矩形 演算法1 動態規劃,假設dp i j 表示以第 i 行第 j 列的格仔為右下角頂點的矩形數目,那麼dp i j 1 dp i 1 j dp i j 1 dp i 1 j...

求1的數目

題目 給定乙個十進位制的正整數n 求從1 開始到n 的所有整數中,出現 1的個數。如 n 2 即1,2 出現1個1 n 12,即 1,2,3,4,5,6,7,8,9,10,11,12 出現5個1.寫乙個函式f n 返回1 到n之間出現 1的個數,如 f 12 5.注意 請你在寫完基本功能 v1.0 ...

矩形內的遞推dp

黑妹和黑弟又聚在一起玩遊戲了,這次他們選擇在乙個n m的棋盤上玩遊戲,棋盤上的每個方格都有乙個非負的分數,遊戲從左上角開始右下角結束,雙方交替的選擇乙個方格並獲得方格上相應的分數,一方選擇的方格必須在上一步另一方選擇的方格 的右邊或者下面,黑妹先開始。現在黑妹想知道,如果雙方都採取最優策略 最優策略...