-
题意:一个\(2\)x\(n\)的矩阵,每个格子可以涂成黑色或者白色,现在问你全部涂完后,连通块个数为\(k\)个一共有多少方案数
-
题解:每一列总共有\(4\)种情况,白白,黑白,白黑,黑黑,设\(dp[i][j][k]\)表示第\(i\)列,涂第\(j\)种情况,涂完后连通块个数\(k\)的情况数,那么很容易从前一列的状态转移过来,判断前一列的涂色情况和当前这一列构成的连通块数,直接转移即可。
-
代码:
#include <bits/stdc++.h> #define ll long long #define fi first #define se second #define pb push_back #define me memset #define rep(a,b,c) for(int a=b;a<=c;++a) #define per(a,b,c) for(int a=b;a>=c;--a) const int N = 1e6 + 10; const int mod = 998244353; const int INF = 0x3f3f3f3f; using namespace std; typedef pair<int,int> PII; typedef pair<ll,ll> PLL; ll gcd(ll a,ll b) {return b?gcd(b,a%b):a;} ll lcm(ll a,ll b) {return a/gcd(a,b)*b;} int n,k; ll dp[1001][2001][4]; int main() { scanf("%d %d",&n,&k); dp[1][1][0]=1,dp[1][2][1]=1,dp[1][2][2]=1,dp[1][1][3]=1; for(int i=2;i<=n;++i){ for(int j=1;j<=k;++j){ 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])%mod; 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])%mod; 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])%mod; 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])%mod; } } ll ans=(dp[n][k][0]+dp[n][k][1]+dp[n][k][2]+dp[n][k][3])%mod; printf("%lld\n",ans); return 0; }
Educational Codeforces Round 51 (Rated for Div. 2) D. Bicolorings (dp)
转载
???????????????????????????????????????????? ???????????????????????????????? ???????????? ???????????????? ????????????????
???????????????????????????????? ???????? ????????????????
本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。
上一篇:AtCoder Regular Contest 126 B - Cross-free Matching (dp,线段树)
下一篇:The 2021 ICPC Asia Regionals Online Contest (I) G Longest Prefix Matching (trie)
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
cocos2d-x 中CCSpriteFrameCache用法与Cocos Creator中有关方案
本文给出cocos2d-x中CCSpriteFrameCache类的使用思路,并对比了Cocos Creator 3.8环境下的实现方案,但有关更高级的缓存方案并没有讨论,请注意。
缓存 cocos creator cocos2d-x CCSpriteFrameCache SpriteFrame -
Educational Codeforces Round 53 (Rated for Div. 2)D(模拟)
D. Berland Fair
codeforces 模拟 #include c++ #ifndef