牛客 火 皇家烈焰 線性dp

2021-09-29 23:35:39 字數 1459 閱讀 5720

題目大意:給出乙個字串表示掃雷遊戲,其中:

0:這個格仔沒有烈焰,且其左右兩個格仔均沒有烈焰

1:這個格仔沒有烈焰,且其左右兩個格仔中只有乙個烈焰

2:這個格仔沒有烈焰,且其左右兩個格仔中均有烈焰

*:這個格仔有烈焰

?:未告訴你本格情況

要求計算一共有多少種方案可以滿足給出的情況

題目分析:因為看到結果要對1e9+7取模,很大概率是乙個線性dp,那麼我們需要考慮一下該怎麼設計轉移方程,因為每次轉移的狀態都是從前向後轉移的,所以我們開乙個dp[2][2][2]的陣列就足夠儲存相鄰兩個狀態了,但因為這個題目給的記憶體足夠,所以我們可以直接每個狀態都儲存一遍,方便理解也更好寫了,其中對於dp[i][j][k],代表的是截止到第i格為止,j:代表當前格仔有無烈焰,k:代表下一格仔有無烈焰,這樣轉移方程也就比較好寫了:

當前格仔為0:dp[i][0][0]=dp[i-1][0][0]

當前格仔為1:dp[i][0][1]=dp[i-1][0][0],dp[i][0][0]=dp[i-1][1][0]

當前格仔為2:dp[i][0][1]=dp[i-1][1][0]

當前格仔為*:dp[i][1][0]=dp[i][1][1]=dp[i-1][0][1]+dp[i-1][1][1]

當前格仔為?:dp[i][1][1]=dp[i][1][0]=dp[i-1][0][1]+dp[i-1][1][1],dp[i][0][0]=dp[i][0][1]=dp[i-1][0][0]+dp[i-1][1][0]

初始化的話,讓dp[0][0][0]=dp[0][0][1]=1就好了

雖然看著很麻煩,但仔細想一下無非就只有這麼多情況,按照公式實現就好了

最後答案是dp[n][0][0]+dp[n][1][0]

**:

#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;

typedef long long ll;

const int inf=0x3f3f3f3f;

const int n=1e6+100;

const int mod=1e9+7;

ll dp[n][2][2];//dp[i][j][k]:截止到i為止,j:當前位置有無炸彈,k:下乙個位置有無炸彈

char s[n];

int main()

else if(s[i]=='1')

else if(s[i]=='2')

else if(s[i]=='*')

else if(s[i]=='?')

}printf("%lld\n",(dp[n][0][0]+dp[n][1][0])%mod);

return 0;

}

牛客小白月賽19 火 皇家烈焰 簡單線性dp

非常水 的一道題 非常水的一道題 非常水的一道 題 發現第i ii個位置與第i 1 i 1i 1和i 1i 1 i 1有關 所以直接暴力思維dpdp dp帶著所有狀態衝就是了 定義d p i j q w dp i j q w dp i j q w 為d pdp dp到第i ii位時 i 1 i 1i...

牛客網 ABBA 線性DP

bobo有乙個長度為2 n m 的字串,由字元 a 和 b 組成。該字串還具有迷人的特性 它可以被分解為長度為2的 n m 子串行,並且在 n m 個子序列中,它們中的n為 ab 而其他m為 ba 給定n和m,找出模數可能的字串數。思路 dpi j 表示用了i個ab,j個ba的方案數,我們考慮當前狀...

每日一題 5月7日題目精講 火 皇家烈焰

火 皇家烈焰 時間限制 c c 1秒,其他語言2秒 空間限制 c c 262144k,其他語言524288k 64bit io format lld帕秋莉掌握了一種火屬性魔法 由於鍾愛掃雷遊戲,帕秋莉把自己圖書館前的走廊看作乙個一維的掃雷地圖,她製造了很多烈焰,排在這條走廊內 現在帕秋莉告訴你一部分...