題目大意:
在一塊地板上整齊的鋪滿地磚,但其中有一些有汙跡,現在要求你找出乙個沒有汙跡的最大正方形(以下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一次只能輸出一位,而且要從前往後輸出,所以要用...