DP 懸線法 二維字首和 p2706 巧克力

2022-05-27 16:15:10 字數 1353 閱讀 6470

王7的生日到了,他的弟弟準備送他巧克力。

有乙個被分成n*m格的巧克力盒,在(i,j)的位置上有a[i,j]塊巧克力。就在送出它的前一天晚上,有老鼠夜襲巧克力盒,某些位置上被洗劫並且穿了洞。所以,你——王7的弟弟王9,必須從這個滿目蒼夷的盒子中切割出乙個矩形巧克力盒,其中不能有被老鼠洗劫過的格仔且使這個盒子裡的巧克力盡量多。

第一行有兩個整數 n、m。第 i+1行的第 j 個數表示a[ i , j ]。如果這個數為 0 ,則表示這個位置的格仔被洗劫過。

輸出最大巧克力數。

表示很水的乙個題.要不是資料有問題我就切了

懸線法+二維字首和。吼啊

不過貌似比只寫二維字首和的麻煩一點.

我們預處理出來懸線法用的陣列.(記得變一下限制條件.

然後真正做懸線法的時候.

我們可以得到乙個合法矩形.

其左上角座標,右下角座標均可求.

然後用二維字首和算一下即可.

ps:這題資料有問題,讀入矩陣的時候要用\(cin\)

**

#include#include#include#define r register

#define n 308

using namespace std;

inline void in(int &x)

while(isdigit(s))

x*=f;

}int n,m,ans;

int res[n][n],sum[n][n];

int ri[n][n],le[n][n],up[n][n];

inline int calc(int a,int b,int c,int d)

int main()

for(r int i=1;i<=n;i++)

for(r int j=2;j<=m;j++)

if(res[i][j] and res[i][j-1])

le[i][j]=le[i][j-1];

for(r int i=1;i<=n;i++)

for(r int j=m-1;j>=1;j--)

if(res[i][j] and res[i][j+1])

ri[i][j]=ri[i][j+1];

for(r int i=1;i<=n;i++)

for(r int j=1;j<=m;j++)

int a=i-up[i][j]+1,b=le[i][j],c=i,d=ri[i][j];

ans=max(ans,calc(a,b,c,d));

} printf("%d",ans);

}

P1578 奶牛浴場 懸線法 dp

原題 題解 給一些障礙物,求最大矩形的面積,不能覆蓋障礙物。懸線概念 有效豎線 除了兩個端點外,不覆蓋任何障礙點的豎直線段。懸線 上端點覆蓋了乙個障礙點或達到整個矩形上端的有效豎線。每個懸線都與它底部的點一 一對應。每個懸線可以向左右擴充套件就會得到乙個矩形。最大矩形一定在這些矩形中。設 h i j...

二維字首和

時間限制 1 sec 記憶體限制 128 mb 提交 155 解決 51 提交 狀態 討論版 命題人 admin 題目描述 一種新型的雷射炸彈,可以摧毀乙個邊長為r的正方形內的所有的目標。現在地圖上有n n 10000 個目標,用整數xi,yi 0 xi,yi 5000 表示目標在地圖上的位置,每個...

二維字首和

1 二維字首和 模板 二維字首和 模板題 acwing 796.子矩陣的和 s i,j 第i行j列格仔左上部分所有元素的和 1.以 x1,y1 為左上角,x2,y2 為右下角的子矩陣的和為 s x2 y2 s x1 1 y2 s x2 y1 1 s x1 1 y1 1 s x y s x y 1 s...