題意:求包含僅兩種顏色且兩種顏色一種連通塊為1,一種連通塊大於1的最大矩形個數,這裡最大矩形指的是該矩形不存在子矩形滿足該性質。
思路:n
nn只有20,考慮列舉矩形的左上角座標和右下角座標,複雜度o(n
4)
o(n^4)
o(n4
)是夠的,找連通塊就dfs
dfsdf
s然後標記搜過的,同時開個陣列記錄每種顏色出現的次數,然後特判一下 ,滿足條件的存入乙個結構體陣列。
然後去重o(t
ot2)
o(tot^2)
o(tot2
),對每個矩形i
ii,判斷是否存在矩形j
jj,使得矩形i
ii為矩形j
jj的子矩形即可。
暴力美學愛了愛了,當時怎麼沒想到呢,怪我太菜了!
#include
using
namespace std;
typedef
long
long ll;
const
int n=
22,m=
405*
405,inf=
0x3f3f3f3f
,mod=
1e9+7;
#define mst(a,b) memset(a,b,sizeof a)
#define pii pair
#define fi first
#define se second
#define pb push_back
int n,vis[n]
[n],cnt,tot;
int d[4]
[2]=
;char a[n]
[n];
struct nodeb[m]
;void
dfs(
int tx,
int ty,
int x,
int y,
int u,
int v,
char c)}}
bool
check
(int x,
int y,
int u,
int v)
*/int ch[26]
=,js=0;
mst(vis,0)
;for
(int i=x;i<=u;i++
)for
(int j=y;j<=v;j++
)dfs
(i,j,x,y,u,v,a[i]
[j]);}
if(js!=2)
return
false
;int f1=
0,f2=0;
for(
int i=
0;i<
26;i++)if
(f1==
1&&f2==1)
return
true
;return
false;}
intmain()
;}}int ans=0;
for(
int i=
1;i<=tot;i++)}
if(ok)
}printf
("%d\n"
,ans)
;return0;
}
總結:遇到題目資料範圍比較小的情況,先想暴力解法,然後在此基礎上去優化,暴力解法是最好想也是最純粹的解法。 HDU 2335 Containers(暴力列舉)
題意 n個40x8的箱子,要求建乙個矩形場地來放這些箱子,箱子間有已知大小的間隙,最高可以放5層。求場地的最小面積,在此基礎上盡量方。思路 設場地x列,y行,那麼x y n 4 5 所以x不會超過sqrt n 所以列舉x求y就行了。比賽的時候考慮到隨著x的增加,答案先變小後變大,所以三分的,但是樣例...
51Nod 1548 列舉 暴力
一天,歐姆諾諾姆來到了朋友家裡,他發現了許多糖果。有藍色和紅色兩種。他知道每顆紅色糖果重wr克,每顆藍色糖果重wb克。吃一顆藍色糖果會給他帶來hb的歡樂值,吃一顆紅色糖果會給他帶來hr的歡樂值。歐姆諾姆最多只能吃c克的糖果,而且每一顆糖果不能只吃一半。現在他想通過吃藍色和紅色的糖果來獲得最大的歡樂值...
演算法學習筆記 13 暴力求解法01 列舉排列
所謂暴力求解法,大意應該是根據提議分析出的所有可能的情況 優化過的研究域 來一一研究,得到最終結果。第一節呢就是列舉排列。這裡的排列指的是乙個集合的元素中根據字典序進行排列。用wikioi的一道題來進行解釋吧 樣例輸入 sample input 3樣例輸出 sample output 1 2 3 1...