code forces 1051 d
看的这个题解:http://www.cnblogs.com/tobyw/p/9685639.html
写的比较清楚。
矩阵类型的计数题
比赛时感觉就像是个dp,然后就跳过了。
现在看着题解写一下,感觉还算可以理解。但是没有dp的思维啊,肯定想不出来的。。
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 6 long long dp[1005][2005][4]; 7 8 const long long mod = 998244353; 9 int main() { 10 11 12 long long n,k; 13 14 cin>>n>>k; 15 16 memset(dp,0,sizeof(dp)); 17 18 dp[1][1][0] = 1; //00 19 dp[1][2][1] = 1; //01 20 dp[1][2][2] = 1; //10 21 dp[1][1][3] = 1; //11 22 23 //cout<<k<<endl; 24 for(int i = 2; i <= n; i++) { 25 // i列最多i * 2 个联通块 26 for(int j = 1; j <= (i << 1); j++) { 27 //cout<<dp[n][k][0]<<' '<<dp[n][k][1]<<' '<<dp[n][k][2]<<' '<<dp[n][k][3]<<endl; 28 //cout<<j<<endl; 29 // 这一列填00的 30 dp[i][j][0] = dp[i - 1][j][0] + dp[i - 1][j][1] + dp[i - 1][j][2] + dp[i - 1][j - 1][3]; 31 dp[i][j][0] %= mod; 32 33 // 填01 34 dp[i][j][1] = dp[i - 1][j - 1][0] + dp[i - 1][j][1] + dp[i - 1][j - 2][2] + dp[i - 1][j - 1][3]; 35 dp[i][j][1] %= mod; 36 37 // 填10 38 dp[i][j][2] = dp[i - 1][j - 1][0] + dp[i - 1][j - 2][1] + dp[i - 1][j][2] + dp[i - 1][j - 1][3]; 39 dp[i][j][2] %= mod; 40 41 // 填11 42 dp[i][j][3] = dp[i - 1][j - 1][0] + dp[i - 1][j][1] + dp[i - 1][j][2] + dp[i - 1][j][3]; 43 dp[i][j][3] %= mod; 44 45 } 46 } 47 48 long long ans = 0; 49 //cout<<dp[n][k][0]<<' '<<dp[n][k][1]<<' '<<dp[n][k][2]<<' '<<dp[n][k][3]<<endl; 50 ans = ans + dp[n][k][0] + dp[n][k][1] + dp[n][k][2] + dp[n][k][3]; 51 ans = ans % mod; 52 //cout<<ans<<endl; 53 printf("%I64d\n", ans); 54 55 56 return 0; 57 }