星星之火OIer 矩形牛棚題解

2021-09-02 19:20:50 字數 1831 閱讀 5332

題目大意:

在一塊地板上整齊的鋪滿地磚,但其中有一些有汙跡,現在要求你找出乙個沒有汙跡的最大正方形(以下1代表有汙跡)。

0 1 1 1 0

1 0 0 1 1

0 1 1 0 1

1 1 1 1 0

0 1 1 1 0

其中最大正方形的邊長為2

狀態轉移方程:dp[i][j]=min(dp[i-1][j],min(dp[i-1][j-1],dp[i][j-1]))+1

先給大家推一遍11

0011

111從第一行開始,我們得到的dp應該是:11

0011

112以dp為這個正方形的右下角,ta最左邊應該到dp[i][j-1]的最左邊+1,ta的最上邊應該到dp[i-1][j]的最上邊+1,ta的左上角應該是dp[i-1][j-1]的左上角+1,綜合來看,就可以得到我們的狀態轉移方程。

完整**如下:

#include#includeusing namespace std;

int dp[1005][1005],i,n,j,k,m,x,y,ans;

bool a[1005][1005];

inline void read(int &x)

inline void pr(int x) //快讀快輸不解釋

int main()

這是最大正方形,但最大長方形看起來就比較難了,首先資料更大,思路也更難想

同樣,再講最大長方形之前,我們再來看一道題,也是求最大長方形,但是是一維的:

題目大意:

輸入一行建築的高度,其間掛一塊廣告牌,要求廣告牌後面的每一寸地方都要有樓房,且要求廣告牌的面積最大。

大致想法就是以每一棟建築作為最矮的建築的最大面積

是不是有點拗口?我們接著看

我們用乙個棧,依次push進去每一棟建築的高度,然後可以把ta大致分為3種情況:

(當前建築記作r,高度記作h,棧記作s)

1、s.top().h>r.h;

2、s.top().h=r.h;

3、s.top().h針對這三種情況,我們可以得到:

1、重複取出s裡面的元素,直到滿足3;

2、不做處理

3、s.push(r);

#include#include#includeusing namespace std;

inline void read(int &x)

while(s>='0'&&s<='9')

x*=f;

}inline void pr(int x)

if(x>9)

pr(x/10);

putchar(x%10+48);

}//快讀快輸不解釋

struct node r,o;

int dp[100005],n,ans;

inline int getans(int f)

while(s>='0'&&s<='9')

x*=f;

}inline void pr(int x)

if(x>9)

pr(x/10);

putchar(x%10+48);

}struct node r,o;

bool a[3005][3005];

int dp[3005][3005],n,k,m,x,y,ans;

inline int getans(int f) {

int maxn=0;

stacks;

f[m+1]=0;

for(int i=1;is.top().h)

s.push(r);

else if(r.h大概就是這樣,不懂的可以一起討論討論.

星星之火OIer 星星題解

題目大意 天文學家經常研究星形圖,其中恆星由平面上的點表示,每顆恆星都有笛卡爾座標。讓恆星的水平為不高於恆星的數量,而不是給定恆星的右側。天文學家想知道恆星水平的分布。例如,檢視上圖中顯示的地圖。星號5的等級等於3 它由三顆恆星形成,數字為1,2和4 並且由2和4編號的星的等級是1.在該地圖上,只有...

星星之火OIer 逆序對(樹狀陣列)題解

老實說,還沒有歸併排序快 先上 再解釋 include includeusing namespace std inline void read long long x while s 0 s 9 x f inline void pr long long x struct node a 500005 ...

星星之火OIer 快讀 快輸

在這裡給大家介紹一下快讀快輸,自己也存個檔。inline void read int x while s 0 s 9 x f 正數不改變符號 x 1 負數就改變 x 1 此之謂快讀inline void pr int x if x 9 因為putchar一次只能輸出一位,而且要從前往後輸出,所以要用...