bzoj2958&3269: 序列染色(Dp)

11人阅读 评论(1) 收藏 举报
分类:

题目传送门
玄学真的不会。

解法:
f[i][j][k]表示第i位,k=0填B,k=1填W。
j=0表示一段长为K连续的B都没有。
j=1表示有一段长为K连续的B。
j=2表示有一段长为K连续的W。
因为要先有B是连续的才要W连续。
那么j=2肯定从j=1转移

保证连续的B后面一定有一个W,连续的W后有一个B,答案就是f[n+1][2][0]
假设这一位选B显然有
f[i][j][0]=f[i-1][j][1]+f[i-1][j][0]
if(i-k+1到i没有W)f[i][1][0]=f[i][1][0]+f[i-k][0][1];
然而这样会有重复,由于f[i][0][0]是乱转移,中间有可能已经有B了,所以:
if(i-k+1到i没有W)f[i][0][0]=f[i][0][0]-f[i-k][0][1];

代码实现:

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<queue>
#include<cmath>
using namespace std;
int b[1110000],w[1110000],f[1110000][3][2];char ss[1110000];
const int mod=1000000007;
int main() {
    int n,k;scanf("%d%d%s",&n,&k,ss+1);
    ss[++n]='X';memset(b,0,sizeof(b));memset(w,0,sizeof(b));
    for(int i=1;i<=n;i++) {
        b[i]=b[i-1];if(ss[i]=='B')b[i]++;
        w[i]=w[i-1];if(ss[i]=='W')w[i]++;
    }
    memset(f,0,sizeof(f));f[0][0][1]=1;
    for(int i=1;i<=n;i++) {
        if(ss[i]!='W')for(int j=0;j<3;j++)f[i][j][0]=(f[i-1][j][0]+f[i-1][j][1])%mod;
        if(ss[i]!='B')for(int j=0;j<3;j++)f[i][j][1]=(f[i-1][j][0]+f[i-1][j][1])%mod;
        if(i<k)continue;
        if(ss[i]!='W'&&w[i]==w[i-k]) {
            f[i][1][0]=(f[i][1][0]+f[i-k][0][1])%mod;
            f[i][0][0]=(f[i][0][0]-f[i-k][0][1])%mod;
        }if(ss[i]!='B'&&b[i]==b[i-k]) {
            f[i][2][1]=(f[i][2][1]+f[i-k][1][0])%mod;
            f[i][1][1]=(f[i][1][1]-f[i-k][1][0])%mod;
        }
    }printf("%d\n",((f[n][2][0])%mod+mod)%mod);
    return 0;
}
查看评论

激励故事[n篇]

激励故事[n篇](1)鸡与大蟒蛇   在一个动物园,饲养员每天都要喂一大盆肉给大蟒蛇吃。  这一天,饲养员突然想看看给大蟒蛇吃鸡会是什么样子。于是他就关了一只鸡到大蟒蛇的笼子里。  这只鸡突然遭遇这飞...
  • citymeteor
  • citymeteor
  • 2002-11-10 10:54:00
  • 985

[DP] bzoj2958&3269: 序列染色

http://www.lydsy.com/JudgeOnline/problem.php?id=2958 http://www.lydsy.com/JudgeOnline/problem.php?i...
  • qq_36038511
  • qq_36038511
  • 2018-03-22 16:13:09
  • 22

BZOJ2958&3269序列染色 DP

Description 给出一个长度为N由B、W、X三种字符组成的字符串S,你需要把每一个X染成B或W中的一个。 对于给出的K,问有多少种染色方式使得存在整数a,b,c,d使得: 1 ...
  • xgc_woker
  • xgc_woker
  • 2018-04-12 16:16:20
  • 6

BZOJ_P2958/BZOJ_P3269 序列染色(动态规划+容斥原理)

BZOJ-P2958 BZOJ-P3269Time Limit: 10 Sec Memory Limit: 256 MB Submit: 212 Solved: 125 [Submit][S...
  • qq_18455665
  • qq_18455665
  • 2016-03-23 15:48:06
  • 390

hdu 4340 树形dp+染色问题

题目大意: 有N个点,用两种颜色标记,标记每个点都要付出一定的花费,且如果某一个点被标记,与它相邻的点的标记同样颜色的花费变为之前的二分之一,求出标记所有点所需要的最小花费。 输入: 第一行输入...
  • qq_24451605
  • qq_24451605
  • 2014-12-20 13:36:13
  • 522

BZOJ 2645 陶陶吃苹果 [树形DP]

题目传送门题解一道树形DP SB题,vijos入门经典题,noip普及组T1前道题。#include #include #include #include #include #define N 400...
  • lemonoil
  • lemonoil
  • 2017-07-17 11:53:55
  • 186

bzoj2958: 序列染色

一眼想到是DP,然而不会。 用DP[i][j][k]表示第i位为k,状态为j的方案数,O(1)转移即可。Orz lych #include #include #define N 1000005 #...
  • Miao_zc
  • Miao_zc
  • 2016-05-26 15:52:43
  • 500

(noip 模拟 染色)<树形DP>

树形DP
  • SDFZspli
  • SDFZspli
  • 2017-08-10 13:02:03
  • 151

美团CODEM 黑白树 思维,拓扑DP

时间限制:1秒 空间限制:32768K 一棵n个点的有根树,1号点为根,相邻的两个节点之间的距离为1。树上每个节点i对应一个值k[i]。每个点都有一个颜色,初始的时候所有点都是白色的。 你需要通...
  • just_sort
  • just_sort
  • 2017-06-30 15:45:05
  • 165

【bzoj4033】树上染色 树形dp

AC通道:http://www.lydsy.com/JudgeOnline/problem.php?id=4033 【题解】 用f[i][j]表示以i为根的子树中染了j个黑点的最大收益。 则f[...
  • chty2018
  • chty2018
  • 2017-02-13 10:46:55
  • 170
    个人资料
    持之以恒
    等级:
    访问量: 1万+
    积分: 2453
    排名: 1万+
    博客专栏
    最新评论