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 }

猜你喜欢

转载自www.cnblogs.com/wangwangyu/p/9694549.html
今日推荐