小\(\mathrm\)的喜歡作畫,尤其喜歡僅使用黑白兩色作畫.
畫作可以抽象成乙個\(r\times c\)大小的\(01\)矩陣.現在小\(\mathrm\)構思好了他的畫作,準備動筆開始作畫.初始時畫布是全白的,他每一次下筆可以將乙個四聯通的部分塗成黑色或白色.
你需要告訴他,在給出的構思下,他最少需要下筆多少次才能完成畫作.
注:四聯通部分表示這個部分的任意兩個點都可以通過四聯通的方式到達.
第一行兩個正整數\(r,c\).
接下來\(r\)行,每行\(c\)個字元, 表示目標畫作.
輸出一行乙個正整數,表示最少需要的下筆步數.
各方面我都不知道說什麼的題目。
題解的證明不是很懂。
大概就是證明這兩種簡單的情況
然後推到一些複雜一點的情況進行歸納
還是把題解的證明放一放吧。
然後列舉每個點作為最後一次被染色的點的情況。
把四聯通的相同顏色邊權置0,不同顏色置1
跑最短路,然後取最遠的點作為答案,對每個點的答案取最小值即可
注意這裡最短路要跑01bfs
複雜度:\(o(n^4)\)
code:
#include #include const int n=52;
const int inf=0x3f3f3f3f;
const int dx[5]=;
const int dy[5]=;
int n,m,g[n][n];
int to[n*n][5][2],ans=inf;
int min(int x,int y)
int cal(int i,int j)
int q[n*n*2],l,r,dis[n*n];
int bfs(int s)
}for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(g[i][j])
mx=max(mx,dis[cal(i,j)]);
return mx+1;
}int main()
}memset(to,-1,sizeof(to));
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
}for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
ans=min(ans,bfs(cal(i,j)));
printf("%d\n",ans);
return 0;
}
2018.10.9 雅禮集訓01 06 T3 math
目錄給出 n,m,x,你需要求出下列式子的值 sum mk i n prod sin k i x 其中 ki 為正整數。由於答案非常大,你只需要輸出答案 保證不為 0 的正負 如果是負數輸出負號,否則輸出正號 和從左往右第乙個非 0 數字上的數字即可。input 第一行乙個整數 t 表示資料組數。對...
雅禮集訓 Day2 T3 聯盟 解題報告
text 國周邊的 n 個小國家構成乙個聯盟以抵禦 text 國入侵,為互相支援,他們建立了 n 1 條雙向通路,使得任意兩個國家可以經過通路相互到達.當乙個國家受到攻擊時,所有其它國家都會沿著最短路徑前往這個國家進行支援,經過每條通路所需的時間均為 1 定義乙個國家的危險程度為所有國家全部趕到需要...
雅禮集訓6 23 T1 電報
每個點都只連向乙個點,所以最終的圖就是若干個基環樹,原問題等價於在基環樹中選出若干條互不相交的鏈,使鏈頂權值和最小,對每個基環樹dp即可。樹型dp 設dp i 表示點i及其子樹中的答案,mx i 表示max,son為i的兒子,那麼dp i dp son mx i c i 複雜度o n 環上dp 先列...