题目链接:http://codeforces.com/problemset/problem/1051/D

看了大佬的题解后觉着是简单的dp,咋自己做就做不来呢。

大佬的题解:https://www.cnblogs.com/tobyw/p/9685639.html

刚看的时候有点感觉 状态肯定是(i,k) 但是这个状态不具备无后效性 会受到i-1两个格子啥颜色的影响 然后就没往下想了qwq

大佬用了二进制来表示这两格的状态

现在的状态就是(i, k, color) color有4种可能 0,0     1,1     0,1     1,0

状态转移方程就很自然了

dp[i][k][0] = dp[i-1][k][0] + dp[i-1][k][1] +dp[i-1][k][2] + dp[i-1][k-1][3]
dp[i][k][1] = dp[i-1][k-1][0] +dp[i-1][k][1] + dp[i-1][k-2][2] +dp[i-1][k-1][3]
dp[i][k][2] = dp[i-1][k-1][0] + dp[i-1][k-2][1] + dp[i-1][k][2] +dp[i-1][k-1][3]
dp[i][k][3] = (dp[i-1][k-1][0] + dp[i-1][k][1] +dp[i-1][k][2] + dp[i-1][k][3]

代码如下

#include <cstdio>
#include <algorithm>
#define ll long long
#define MOD 998244353
using namespace std; const int maxn = ;
ll dp[maxn][maxn<<][]; int main(int argc, char const *argv[])
{
int n, kl;
scanf("%d%d", &n, &kl);
dp[][][] = ;
dp[][][] = dp[][][] = ;
dp[][][] = ;
for (int i = ; i <= n; i++) {
for (int k = ; k <= (i << ); k++) {
dp[i][k][] = (dp[i-][k][] +
dp[i-][k][] +
dp[i-][k][] +
dp[i-][k-][]) % MOD;
dp[i][k][] = (dp[i-][k-][] +
dp[i-][k][] +
dp[i-][k-][] +
dp[i-][k-][]) % MOD;
dp[i][k][] = (dp[i-][k-][] +
dp[i-][k-][] +
dp[i-][k][] +
dp[i-][k-][]) % MOD;
dp[i][k][] = (dp[i-][k-][] +
dp[i-][k][] +
dp[i-][k][] +
dp[i-][k][]) % MOD;
}
}
printf("%lld\n", (dp[n][kl][] + dp[n][kl][] + dp[n][kl][] + dp[n][kl][]) % MOD);
return ;
}

CodeForces - 1051D Bicolorings(DP)的更多相关文章

  1. CodeForces - 1051D (线性DP)

    题目:https://codeforces.com/problemset/problem/1051/D 题意:一个2行n列的矩形,上面有黑白块,然后问你怎么布置才能有k个连通块,问有多少种方案数 思路 ...

  2. codeforces 1051 D. Bicolorings (DP)

    D. Bicolorings time limit per test 2 seconds memory limit per test 256 megabytes input standard inpu ...

  3. 【Codeforces 1051D】Bicolorings

    [链接] 我是链接,点我呀:) [题意] 题意 [题解] dp[i][j][k]表示前i列,有j个联通块下,最后一列的状态为k的方案数 k如果为1的话,表示最后一列两个块不一样,k如果为0表示一样 枚 ...

  4. codeforces 682D(DP)

    题目链接:http://codeforces.com/contest/682/problem/D 思路:dp[i][j][l][0]表示a串前i和b串前j利用a[i] == b[j]所得到的最长子序列 ...

  5. codeforces 666A (DP)

    题目链接:http://codeforces.com/problemset/problem/666/A 思路:dp[i][0]表示第a[i-1]~a[i]组成的字符串是否可行,dp[i][1]表示第a ...

  6. Codeforces 176B (线性DP+字符串)

    题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=28214 题目大意:源串有如下变形:每次将串切为两半,位置颠倒形成 ...

  7. Codeforces 55D (数位DP+离散化+数论)

    题目链接: http://poj.org/problem?id=2117 题目大意:统计一个范围内数的个数,要求该数能被各位上的数整除.范围2^64. 解题思路: 一开始SB地开了10维数组记录情况. ...

  8. Codeforces 264B 数论+DP

    题目链接:http://codeforces.com/problemset/problem/264/B 代码: #include<cstdio> #include<iostream& ...

  9. CodeForces 398B 概率DP 记忆化搜索

    题目:http://codeforces.com/contest/398/problem/B 有点似曾相识的感觉,记忆中上次那个跟这个相似的 我是用了 暴力搜索过掉的,今天这个肯定不行了,dp方程想了 ...

随机推荐

  1. N维偏序:cdq分治

    cdq(陈丹琦)分治,是一种类似二分的算法.基本思想同分治: 递归,把大问题划分成若干个结构相同的子问题,直到(L==R): 处理左区间[L,mid]对右区间[mid+1,R]的影响: 合并. 它可以 ...

  2. Java IO(二)——RandomAccessFile

    一.RandomAccessFile RandomAccessFile类可以说是Java语言中功能最为丰富的文件访问类,它提供了众多的文件访问方法.RandomAccessFile类支持"随 ...

  3. DES对称加密算法详解和c++代码实现(带样例和详细的中间数据)

    特点: 1.DES是对称性加密算法,即加密和解密是对称的,用的是同一个密钥 2.DES只处理二进制数据,所以需要将明文转换成为2进制数据 3.DES每次处理64位的数据,所以应该将明文切割成64位的分 ...

  4. UVA10838 The Pawn Chess

    UVA好题没人写系列,感觉可以稍稍练习一下面向对象编程的形式(大雾) 题意很简单,在国际象棋的棋盘中有一些兵,走到对方底线即为胜利,问最优决策下谁能获胜.并输出最小步数. 首先这里的棋盘都只有\(4\ ...

  5. Apache Spark 2.2.0新特性介绍(转载)

    这个版本是 Structured Streaming 的一个重要里程碑,因为其终于可以正式在生产环境中使用,实验标签(experimental tag)已经被移除.在流系统中支持对任意状态进行操作:A ...

  6. mysqldump 和mysqlbinlog

    一.mysqldump 1.备份test库 #mysqldump -uroot -p' test >test.sql 2.备份 -B参数 ' -B test >test_B.sql --B ...

  7. hdu5943素数间隙与二分匹配

    题意: 给出n和s,匹配(s+1,s+2,s+3......s+n)和(1,2,3,4,5........n)让(s+x)%x==0,判断是否有解 思路: 先用程序跑一边,发现1到1e9得素数间隙小于 ...

  8. 如何让vba与java的TripleDES算法通用

    本文链接:http://www.cnblogs.com/Charltsing/p/TripleDES.html 众所周知,java默认采用的TripleDES算法是ECB+PKCS#5填充方式.网上可 ...

  9. 安装使用swoole

    swoole首页:https://www.swoole.com/ 方法1:使用pecl安装 pecl install swoole 注意,php版本必须是7.0以及7.0以上的版本. 方法2:编译源码 ...

  10. SpringMvc的Controller singleton synchronized

    SpringMvc的controller是singleton的(非线程安全的) - lvyuanj的专栏 - CSDN博客 https://blog.csdn.net/lvyuanj/article/ ...