掃雷 洛谷p2327

2021-08-10 07:11:35 字數 865 閱讀 5668

輸入格式:

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

輸出格式:

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

輸入樣例#1:

複製

2

1 1

輸出樣例#1:

複製

2
如果從上到下確定每個雷的位置,那麼判斷某個位置能否為雷只受它上面2格雷的情況影響,於是可以將i-2~i的雷記錄為乙個3位的二進位制數。考慮狀壓dp,dp[i][sta]表示前i個雷,i-2~i的雷的分布為sta時的總數,那麼dp[i][sta]=dp[i-1][(sta>>1)|4]+dp[i-1][sta>>1],表示第i-2的位置放不放雷。轉移前需要判斷sta這個狀態是否合法。設counter(x)為x的二進位制表示中1的個數,num為第二列對應的數字,合法也就意味著counter(sta)==num[i-1]且counter(sta>>1)<=num[i],此時就可以進行轉移。

#include#include#define f(i,l,r) for(i=(l);i<=(r);i++)

using namespace std;

const int maxn=10005;

int n,a[maxn];

int dp[maxn][8],f[8];

inline int cal(int x)

return num;

}inline void maketable()

int main()

cout<

洛谷2327 掃雷

輸入格式 第一行為n,第二行有n個數,依次為第二列的格仔中的數。1 n 10000 輸出格式 乙個數,即第一列中雷的擺放方案數。輸入樣例 1 2 1 1 輸出樣例 1 2思路 玩過掃雷的人都知道一旦第乙個格仔的雷定了,那麼剩下的格仔也都定了,故答案只有0,1,2三種,騙分資料為30,30,40,故我...

洛谷 P2327 SCOI2005 掃雷

看起來我做的和其他題解不一樣 那就發一篇吧 首先本題情況看似無厘頭,但是仔細觀察,不難發現 我們可以假設第一種情況,接著可以推出第二種 然後有了兩個已知的後,第三個顯而易見 如果你要問我怎麼推出來的嗎,我在裡面說的的邏輯判斷已經很明白了 include include include include...

洛谷 P2327 SCOI2005 掃雷

輸入格式 第一行為n,第二行有n個數,依次為第二列的格仔中的數。1 n 10000 輸出格式 乙個數,即第一列中雷的擺放方案數。輸入樣例 1 2 1 1 輸出樣例 1 2演算法1 列舉左邊每個位置是否有雷,複雜度o 2 n n 演算法2 我們發現,當前兩個位置確定時,後面的位置也就可以推出來了。於是...