洛谷P2327 SCOI2005 掃雷

2022-05-13 17:16:26 字數 1354 閱讀 3413

輸入格式:

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

輸出格式:

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

輸入樣例#1:

2

1 1

輸出樣例#1:

2
迷之dp,如果沒看演算法標籤,可能會想岔到數學方向。

乙個數字會影響它正左、左上、左下三個格仔的方案。考慮左邊和左上兩個方向的地雷數,可以推出左下是否有雷。

然而這樣考慮,決策似乎是有後效性的。改為列舉左上情況,考慮左邊和左下兩個方向的雷數。

方程寫了一長串……

1

/*by silvern

*/2 #include3 #include4 #include5 #include6 #include7 #include8

using

namespace

std;

9const

int mxn=10010;10

intread()

13while(ch>='

0' && ch<='9')

14return x*f;15}

16int

n;17

int f[mxn][4

];18

intw[mxn];

19//

f[0] 左邊和左下沒有雷

20//

f[1] 僅左下有雷

21//

f[2] 僅左邊有雷

22//

f[3] 左邊和左下有雷

23int

main()

27else

if(w[1]==1)

28else

if(w[1]==2)

29for(int i=2;i)

37if(w[i]==2)42

if(w[i]==3)45

}46if(w[n]==1)printf("

%d\n

",f[n-1][1]+f[n-1][2

]);47

if(w[n]==2)printf("

%d\n

",f[n-1][3

]);48

if(w[n]==3)printf("

0\n"

);49

if(w[n]==0)printf("

%d\n

",f[n-1][0

]);50

return0;

51 }

洛谷 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 思路 可根據左邊第乙個格仔和右邊第乙個格仔的方案 放or不放 推出左邊第二個格仔的方案,以此類推,最終可以推出左邊n個格仔的方案...