Citric 天空中的繁星 DP

2021-07-06 04:27:03 字數 2235 閱讀 7064

天空中的繁星

【問題描述】

lemon最近買了一台數位相機。某天lemon很無聊,於是對著夜空拍了一張**,然後把**匯入了電腦。

lemon想依靠電腦的力量,完成他小時候經常做卻從來沒有成功過的事情:數天空中有多少顆星星。

lemon已經把相片處理成了黑白的,也就是說,每個畫素只可能是兩個顏色之一,白或黑。lemon定義畫素(x,y)處是一顆星星,當且僅當,畫素(x,y),(x-1,y),(x+1,y),(x,y-1),(x,y+1)都是白色的。因此乙個白色畫素有可能屬於多個星星,也有可能有的白色畫素不屬於任何一顆星星。

借助電腦的力量,數出有多少顆星星對lemon實在太容易了,他很快就完成了。

但這時,lemon突然想到,七夕節把這張**送給gf當禮物實在太浪漫了,但是這張**具有研究價值,所以lemon不想把整張**都送給gf,而只準備從中裁下一小塊長方形**送給gf。但為了保證浪漫的效果,lemon認為,他送給gf的那一小塊相片中至少應該有k顆星星。

現在lemon想知道,到底有多少種方法裁下這一小塊長方形相片呢?

【輸入格式】

輸入檔案中的第一行為三個正整數n,m,k,意義見題目所示。

接下來的n行,每行為乙個長度為m的字串,字串僅由'.'和'*'構成,其中:'.'表示這個畫素為黑色,'*'表示這個畫素為白色。

【輸出格式】

輸出檔案中僅一行為乙個整數,表示lemon有多少種滿足題意的裁剪方法。

【輸入輸出樣例】

輸入:5 6 3

***...

****..

.**.*.

******

.*.***

輸出: 3

【樣例說明】

圖中共有4顆星星,分別位於第2行第2列、第2行第3列、第4行第2列、第4行第5列。

有3種符合題意的選擇方法(以左上角行列 - 右下角行列方式給出): (1,1)-(5,4),(1,1)-(5,5),(1,1)-(5,6)。

【資料範圍】

對於20%的資料,滿足:n,m<=20;

對於40%的資料,滿足:n,m<=100;

對於70%的資料,滿足:n,m<=200;

對於100%的資料,滿足:n,m<=500,0

【演算法分析】

大意是求在乙個01矩陣中劃出

首先這題按照資料範圍,幾種級別的演算法非常明顯。

20%,o(n^6),直接六方暴力,列舉左上和右下然後二維掃瞄。

40%,o(n^4),用字首和f[i][j]表示從(1,1)到(i,j)這樣乙個矩形內有多少個星星,就可以o(1)計算出乙個矩形的星星數量。

70%,o(n^3 logn),對於40%的方法,可以很明顯的發現,如果我們確定了上界、下界和右邊界,那麼可行的左邊界一定是連續的一段,所以我們只要二分查詢滿足條件的最大的左邊界left在**,那麼從1到left都是滿足條件的。

100%,o(n^3),對於70%的演算法,如果我們確定了上下邊界,那麼如果右邊界遞增的話,那麼滿足條件的最大左邊界一定是非遞減的,所以我們維護乙個滑窗left,right表示右邊界在right時的最大左邊界left,每次right增加的時候對left更新,可以將二分那個logn的複雜度給去掉。

#include #include #include using namespace std;

#define rep(i,n) for (int i=1;i<=n;i++)

#define calc(i,j,p,q) (s[p][q]-s[p][j-1]-s[i-1][q]+s[i-1][j-1])

const int n=605;

int n,m,a[n][n],f[n][n],s[n][n],k;

long long ans;

int l,r;

int find(int i,int p,int q)

return ret;

}int main()

n-=2;m-=2;

rep(i,n) rep(j,m)

if (a[i][j+1] && a[i+1][j] && a[i+1][j+1] && a[i+1][j+2] && a[i+2][j+1]) f[i][j]=1;

rep(i,n) rep(j,m) s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+f[i][j];

rep(i,n) rep(p,i)

} printf("%i64d\n",ans);

return 0;

}

5 3 天天向上

數碼管 光照度 溫濕度 感測器測試 網口 uart測試 步進電機 強上拉電阻 stc晶元手冊 include include int josephu int n,int m josephunode int josephu int n,int m tail index i tail next head...

2017 03 04 天天愛旅遊

天天突發奇想,要去 g 地,於是他搞來了一張地圖,看怎麼走才好。地圖上有很多城市,g 地也是一座城市。每兩座城市之間都可能有直達方法,也有可能 兩座城市之間並不能直接相通,而要通過其他的城市轉達。對於兩個城市之間的直達方法,需要一定的時間,當然,如果從 a 城市到 b 城市的直達方法需要 t 時間,...

15天學會jQuery 第15天

讓我產生修改想法的,是他的 在yahoo上的應用。我不喜歡他使用的 所以我重寫了他的部分 成了現在這個樣子 我的示例 改進 html標準校驗 我的 可以通過w3.org的測試 改進 命名 在我修改cody的 的時候我發現他使用了乙個用來儲存鏈結名稱的叫做 title 的變數名,這會導致一些混淆。我標...