1. 程式人生 > 實用技巧 >Codeforces Round #594 (Div. 1) A. Ivan the Fool and the Probability Theory

Codeforces Round #594 (Div. 1) A. Ivan the Fool and the Probability Theory

題目連結:https://codeforc.es/contest/1239/problem/A

題意:給定n*m的矩陣,每個格子可以塗黑色或者白色,要求每個格子的顏色至多隻能和相鄰的一個格子相同顏色 共享邊為相鄰的格子,為有多少種塗色方法

思路:模擬寫一下就能發現,在第一行和第一列確定的情況下這個矩陣是固定的,那麼只需要考慮得到所有第一行和第一列的方案數即可,

假設我們先確定第一行,發現如果不是全部黑白間隔的話,那麼整個矩陣就是固定的,那麼假設第一行是間隔的,那麼 第一列的方案數就是答案的一部分,

假設第一列是間隔的,那麼第一行的方案數就是答案的一部分, 但是有可能第一行和第一列都是間隔的,所以要減去一個1,因為顏色可以調換,所以乘以2

考慮如何用dp來求 第一行的方案數, 用dp[i][0]表示第i個格子塗白色,dp[i][1]表示第i個格子塗黑色

那麼考慮如何轉移, 如果當前的格子是黑格子 那麼上一個可以是黑格子,也可以是白格子,上一個是白格子的話 顯然+dp[i-1][0]即可

上一個是黑格子的話 用黑格子來轉移是不行的,因為dp[i-1][1]中包含了第i-2個是黑格子 所以考慮用白格子來轉移,假設上一個是黑格子的話,那麼i-2個就一定是白格子

所以dp[i][1]=dp[i-1][0]+dp[i-2][0] 同理dp[i][0]=dp[i-1][1]+dp[i-2][1]

 1 #include<bits/stdc++.h>
 2
using namespace std; 3 #define ll long long 4 #define ull unsigned long long 5 #define pb push_back 6 const int maxn=1e5+10; 7 const int mod=1e9+7; 8 9 ll dp[maxn][2]; 10 11 12 13 int main() 14 { 15 ios::sync_with_stdio(false); 16 cin.tie(0); 17 dp[1][1]=dp[1][0]=1; 18 dp[2][1
]=dp[2][0]=2; 19 for(int i=3;i<maxn;i++) 20 { 21 dp[i][0]=(dp[i-1][1]+dp[i-2][1])%mod; 22 dp[i][1]=(dp[i-1][0]+dp[i-2][0])%mod; 23 } 24 25 int n,m; 26 cin>>n>>m; 27 ll ans=dp[n][0]+dp[m][0]-1; 28 ans*=2; 29 ans=(ans+mod)%mod; 30 cout<<ans<<'\n'; 31 32 33 34 35 }
View Code