狀態壓縮模版3 地雷

2022-06-02 09:30:14 字數 2184 閱讀 5595

首先這個應該可以說是我短時間內的這個部落格,也就是說很長的一段時間應該都不會再去寫部落格了,當然有喜歡的東西我還是要記錄下來,所以不多說,看一下這道題

時間限制: 1 sec  記憶體限制: 4 mb

提交: 188  解決: 111

[提交] [狀態] [討論版] [命題人:admin]

題目描述

題意相信大家都玩過掃雷的遊戲。那是在乙個n*n的矩陣裡面有一些雷,要你根據一些資訊找出雷來。萬聖節到了,「餘」人國流行起了一種簡單的掃雷遊戲,這個遊戲規則和掃雷一樣,如果某個格仔沒有雷,那麼它裡面的數字表示和他8連通的格仔裡面雷的數目。現在棋盤是n*2的,第一列裡某些格仔是雷,而第二列沒有雷,如:

o 1* 2

* 3* 2

o 2* 2

* 2 ('*'代表有雷,'o'代表無雷)

由於第一類的雷有可能有多種方案滿足第二列的數的限制,你的任務即根據第二列的資訊求第一列雷有多少中擺放方案。

輸入第一行為n,第二行有n個數,依次為第二列的格仔中的數。(1<=n<=10000)

輸出乙個數,即第一列中雷的擺放方案數。

樣例輸入

1 1樣例輸出

我相信標題已經義正言辭的告訴我們要用狀態壓縮但是怎麼用呢,包括的話這道詭異的題目他問我們的到底是什麼呢,下面看講解

首先這個棋盤是2*n的,玩法和我們一樣,但是他的規模卻遠遠小於我們的標準掃雷,所以的話我說乙個點的周圍最大只有3個雷是完全可以理解的,因為上下是數字不是雷,然後右邊是空的,也就是只有左邊有3個雷,所以題目就是這個意思

然後的話怎麼用這個壓縮是我們一定要考慮的問題,我們知道一共有3行(意思就是說最多有三個雷),那麼如果我們定義乙個f狀態,就是判斷這個點的當前行有雷和下一行有雷,那麼假如說

000 這個是我們的雷的布陣的話,那麼我們是不是設當前的為中間的0,下一行就為第三個0,那麼我們繼承的上乙個狀態的當前行就是第乙個0,下一行就是第二個0,那麼我們就可以去判斷到底有多少種情況了,是嗎?,所以接下來我們來看一下情況的分布情況

簡要分析一下這個繼承狀態是怎麼樣實現的啊

首先我們知道的就是說f[k][2][2]表示的就是第k行的狀態的處理

那麼第乙個引數2表示的就是說下一行有沒有雷的情況啊,1表示有雷,0表示沒有雷

那麼第二個引數2表示的就是說當前行有沒有雷的情況啊,1表示有雷,0表示沒有雷

那麼就會出現4種情況,1沒有雷  2有乙個雷  3有兩個雷  4有三個雷

(備註:紅色表示的是我們當前要處理的狀態,藍色表示我們上一行的狀態)

第一種情況:只有乙個繼承的狀態

0 0 0,這個是我們的情況的顯示,不難看出當前行和下一行都沒有雷,然後上乙個狀態也是當前行和下一行都沒有雷

第二種情況:有三個繼承的狀態00

1第三種情況:同樣有三個繼承的狀態01

1第四種情況,只有乙個繼承的狀態

1所以看到這四種情況之後我相信基本上**的模版已經有感覺了,所以的話我們的最後答案就是處理完全部之後,最後一行有雷和最後一行沒有雷的情況的數量的總和就是我們的總數量

**的實現(我直接放乙個注釋版的,其實講的也很清楚了,而且碼量很小,記憶起來也比較方便)

1 #include2 #include3 #include4 #include5 #include6 #include7

using

namespace

std;

8int a[10010];9

int f[10010][2][2];/*

第二個引數1表示下一行還需要乙個1,0表示下一行不需要1,

10第三個引數表示的是當前行有沒有雷,1是有雷,2是沒有雷

*/11

intmain()

1225

else

if(a[i]==2)/*

有兩個雷

*/26

31else

if(a[i]==3) f[i][1][1]=f[i-1][1][1];/*

*/32

}33 printf("

%d\n

",f[n][0][0]+f[n][0][1]);/*

最後就分成最後一行有雷和無雷的情況相加

*/34

return

0;

35 }

所以要很久以後再會了,畢竟我要進擊演算法高階了,所以的話如果還會出現估計就是提到一些比較有意思或者說困擾了我很久的題了

狀態壓縮模版2 選數

這是第二道模版題,然後的話這道模版題其實和上一題 這道題其實二進位制的思想會體現的更加明顯,因為的話我們一旦把我們需要的數轉化成二進位制之後,然後乙個乙個去判斷,因為這種做法真的真的太神奇了,所以我覺得我講不太通,就直接放 吧 所以直接看 吧 1 include2 include3 include4...

狀態壓縮DP

首先,我們以一道狀壓經典題tsp來引入。tsp問題 一張圖上有n個點,給定相應的鄰接矩陣,需要求出從0號節點出發,經過且只經過每個頂點一次,最後仍回到0號節點的最小邊權。思路 假設現在已訪問過的頂點集合 起點0當作還未訪問過的頂點 為s,當前所在頂點為v,用dp s v 表示從v出發訪問剩餘的所有頂...

狀態壓縮DP

theme 給定乙個n m的玉公尺田,1 n,m 12。值為0表示不能在該塊種草,為1表示可以。現在要在其上中若干草地,要求任意草地間不相鄰 沒有公共邊 問不考慮草地個數的情況下,有多少種種植的方案?solution 用dp。又範圍很小,所以考慮狀態壓縮dp,另dp i j 表示從前i行種植,最後一...