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

2021-10-24 12:43:57 字數 1359 閱讀 5968

非常水

的一道題

非常水的一道題

非常水的一道

題 發現第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−

1位是否有火(j)

(j)(j

),ii

i位置是否有火(q)

(q)(q

),i+

1i+1

i+1位置是否有火(w)

(w)(w

)

#include using namespace std;

#define int long long

const int maxn=1e6+10;

const int mod=1e9+7;

int n,m,dp[maxn][2][2][2];

char a[maxn];

signed main()

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

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

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

else

for(int j=0;j<=1;j++)

for(int q=0;q<=1;q++)

for(int w=0;w<=1;w++)

dp[i][j][q][w]%=mod;

} int ans=0;

for(int i=0;i<=1;i++)

for(int j=0;j<=1;j++)

ans = (ans+dp[n][i][j][0] )%mod;

cout << ans;

}

但是似乎可以優化掉一維

因為轉移的時候i−1

i-1i−

1是用不到的

在轉移狀態i

ii時,只需要i−1

i-1i−

1的**狀態和i

ii的**狀態

實際上只需要dp[

i][q

][w]

dp[i][q][w]

dp[i][

q][w

]即可

牛客 火 皇家烈焰 線性dp

題目大意 給出乙個字串表示掃雷遊戲,其中 0 這個格仔沒有烈焰,且其左右兩個格仔均沒有烈焰 1 這個格仔沒有烈焰,且其左右兩個格仔中只有乙個烈焰 2 這個格仔沒有烈焰,且其左右兩個格仔中均有烈焰 這個格仔有烈焰 未告訴你本格情況 要求計算一共有多少種方案可以滿足給出的情況 題目分析 因為看到結果要對...

牛客小白月賽19

a 水 滔天巨浪 includeusing namespace std int n int a 10004 b 100004 int main int ans 0 int hh 0 a 0 0 a n 1 1001 for int i 1 i n i printf d n hh b 木 迷霧森林 i...

牛客小白月賽19 弱版 C

題意 帕秋莉掌握了一種土屬性魔法 這種魔法可以在一片k k大小的乙個正方形區域內產生 但是如果某片即將產生 的區域內有建築物,帕秋莉會停止施法 整個地圖大小為n m,其中一些地方有建築 請問有多少種可能的情況,使得帕秋莉會停止施法 思路 二維字首和思想 記錄在任意的 k k 的區間內是否存在1 1 ...