洛谷 2327 SCOI2005 掃雷

2022-05-12 13:02:08 字數 1581 閱讀 1856

輸入輸出格式

輸入格式:

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

輸出格式:

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

輸入輸出樣例

輸入樣例#1: 複製

2 1 1

輸出樣例#1: 複製

2借鑑了乙個大神的思路,這道題我用的四維dp。

用四維陣列f儲存

一維第二列位置,二維三維四維存i-1,i,i+1是否有雷

初始化:f[0][0][0][0]=f[0][0][0][1]=1; 就是第乙個地方有雷或無雷兩種情況。

用四維陣列f儲存

一維第二列位置,二維三維四維存i-1,i,i+1是否有雷

初始化:f[0][0][0][0]=f[0][0][0][1]=1;

如果a[i]為0

f[i][0][0][0]=f[i-1][0][0][0]+f[i-1][1][0][0];

f[i][1][0][0]=f[i-1][0][1][0]+f[i-1][1][1][0];

f[i][0][1][0]=f[i-1][0][0][1]+f[i-1][1][0][1];

f[i][0][0][1]=f[i-1][0][0][0]+f[i-1][1][0][0];

如果為2 f[i][1][1][0]=f[i-1][0][1][1]+f[i-1][1][1][1];

f[i][1][0][1]=f[i-1][0][1][0]+f[i-1][1][1][0];

f[i][0][1][1]=f[i-1][0][0][1]+f[i-1][1][0][1];

如果為3

f[i][1][1][1]=f[i-1][0][1][1]+f[i-1][1][1][1]

然後如果a[n]=1

ans=f[n][1][0][0]+f[n][0][1][0];

因為n+1就沒有了

所以肯定四維為0

如果a[n]=2

ans=f[n][1][1][0];

如果a[n]=3

肯定無解

如果a[n]=0

ans=f[n][0][0][0]

輸出ans

#include

using

namespace

std;

const

int maxn=10005;

int n,f[maxn][2][2][2],ans,a[maxn];

int main()

f[0][0][0][0]=f[0][0][0][1]=1; //初始化

for(register

int i=1;i<=n;i++)

if(a[i]==1)

}if(a[n]==0) ans=f[n][0][0][0]; //判斷

else

if(a[n]==1) ans=f[n][1][0][0]+f[n][0][1][0];

else ans=f[n][1][1][0];

printf("%d",ans);

}

洛谷 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 我們發現,當前兩個位置確定時,後面的位置也就可以推出來了。於是...

洛谷P2327 SCOI2005 掃雷

輸入格式 第一行為n,第二行有n個數,依次為第二列的格仔中的數。1 n 10000 輸出格式 乙個數,即第一列中雷的擺放方案數。輸入樣例 1 2 1 1 輸出樣例 1 2迷之dp,如果沒看演算法標籤,可能會想岔到數學方向。乙個數字會影響它正左 左上 左下三個格仔的方案。考慮左邊和左上兩個方向的地雷數...