原题链接:http://codeforces.com/problemset/problem/803/E

题意:给一个n长度的字符串,其中'?'可以替换成'D'、'W'、'L'中的任意一种,'D'等价于0, 'W'等价于1、'L'等价于-1。输出所有'?'被替换掉后,W和L的数目之差为k,且任意一个[1, i]的子串中W和L数目之差不能等于k。

思路:用DP做。定义bool dp[i][j]代表前i个字符W和L数目之差为j, -k<=j<=k(在数组中范围为[0, 2*k]),那么当str[i]为'D'时dp[i][j]转移到dp[i-1][j], 为'W'时dp[i][j]转移到dp[i-1][j+1], str[i]为'D'时dp[i][j]转移到dp[i-1][j-1], 初始值dp[0][0]为true。

接着用一遍dfs倒推求结果,注意字符加的位置。

AC代码:

 #include<iostream>
#include<cstring>
#include<cstdio>
#include<string>
using namespace std;
int dp[][];
int n,k;
string str;
void change(int i, int L, int D, int W){
for(int j=;j<*k;j++){
if(dp[i-][j]){
if(D) dp[i][j]=;
if(L){
if(i!=n&&j-==)//[1, i]子串中W和L数目之差不能等于k
continue;
dp[i][j-]=;
}
if(W){
if(i!=n&&j+==*k)
continue;
dp[i][j+]=;
}
}
}
return;
}
string ss;
//int t=0;
bool res(int i, int j, string ans){
//t++;
if(i==&&j==k){
ss=ans;
return ;
}
if(str[i-]!='?'){
if(str[i-]=='D') return res(i-, j, 'D'+ans);
if(str[i-]=='W') return res(i-, j-, 'W'+ans);
if(str[i-]=='L') return res(i-, j+, 'L'+ans);
}
else
{
if(dp[i-][j]&&res(i-, j, 'D'+ans)) return ;
if(dp[i-][j-]&&res(i-, j-, 'W'+ans)) return ;
if(dp[i-][j+]&&res(i-, j+, 'L'+ans)) return ;
} return ;
}
int main()
{
while(cin>>n>>k)
{
memset(dp, , sizeof(dp));
dp[][k]=;
cin>>str;
if(str[n-]=='D'){
cout<<"NO"<<endl;
continue;
}
for(int i=;i<=n;i++){
if(str[i-]=='?')
change(i, , , );
else if(str[i-]=='D')
change(i, , , );
else if(str[i-]=='W')
change(i, , , );
else
change(i, , , );
}
string ans;
if(dp[n][]){
res(n, , ans);
cout<<ss<<endl;
}
else if(dp[n][*k]){
res(n, *k, ans);
cout<<ss<<endl;
}
else
cout<<"NO"<<endl;
//cout<<t<<endl;
}
return ;
}

这代码调了我好久啊QAQ,感觉自己真菜

Codeforces 803E--Roma and Poker (DP)的更多相关文章

  1. Educational Codeforces Round 20 E - Roma and Poker(dp)

    传送门 题意 Roma在玩一个游戏,一共玩了n局,赢则bourle+1,输则bourle-1,Roma将会在以下情况中退出 1.他赢了k个bourle 2.他输了k个bourle 现在给出一个字符串 ...

  2. Codeforces 803E - Roma and Poker

    http://codeforces.com/problemset/problem/803/E E. Roma and Poker  time limit per test           2 se ...

  3. CodeForces - 710E Generate a String (dp)

    题意:构造一个由a组成的串,如果插入或删除一个a,花费时间x,如果使当前串长度加倍,花费时间y,问要构造一个长度为n的串,最少花费多长时间. 分析:dp[i]---构造长度为i的串需要花费的最短时间. ...

  4. Educational Codeforces Round 51 D. Bicolorings(dp)

    https://codeforces.com/contest/1051/problem/D 题意 一个2*n的矩阵,你可以用黑白格子去填充他,求联通块数目等于k的方案数,答案%998244353. 思 ...

  5. Codeforces 536D - Tavas in Kansas(dp)

    Codeforces 题目传送门 & 洛谷题目传送门 其实这题本该 2019 年 12 月就 AC 的(详情请见 ycx 发此题题解的时间),然鹅鸽到了现在-- 首先以 \(s,t\) 分别为 ...

  6. Codeforces 295D - Greg and Caves(dp)

    题意: 给出一个 \(n \times m\) 的矩阵,需对其进行黑白染色,使得以下条件成立: 存在区间 \([l,r]\)(\(1\leq l\leq r\leq n\)),使得第 \(l,l+1, ...

  7. Codeforces 467C George and Job(DP)

    题目 Source http://codeforces.com/contest/467/problem/C Description The new ITone 6 has been released ...

  8. Codeforces A ACM (ACronym Maker) (dp)

    http://codeforces.com/gym/100650 概要:给出一个缩写,和一些单词,从单词中按顺序选一些字母作为缩写,问方案数. 限制:某些单词要忽略,每个单词至少要选一个字母. dp[ ...

  9. codeforces 813 D. Two Melodies(dp)

    题目链接:http://codeforces.com/contest/813/problem/D 题意:求两个不相交的子集长度之和最大是多少,能放入同一子集的条件是首先顺序不能变,然后每一个相邻的要么 ...

随机推荐

  1. Not a Number (NaN)

    NaN can be produced by: 1. 0/0 2. Inf - Inf 3. Inf/Inf 4. 0*Inf 5. rem(x,y), where y=0 or x=Inf

  2. python自定义异常实例详解

    python自定义异常实例详解 本文通过两种方法对Python 自定义异常进行讲解,第一种:创建一个新的exception类来拥有自己的异常,第二种:raise 唯一的一个参数指定了要被抛出的异常 1 ...

  3. State Hook

    1 useState函数的第一个参数,是state变量的初始值. 2 每次渲染时,多个State Hook的顺序.数量都是一样的.(不能多.不能少) 3 state变量是只读的 4 state变量发生 ...

  4. Win10.资料

    1.Win10版本consumer editions和business editions有什么区别?(http://www.winwin7.com/JC/10722.html) 2.密钥 win10 ...

  5. Robotframework使用DatabaseLibrary连接mysql数据库

    Robotframework使用DatabaseLibrary连接mysql数据库 进行数据库操作,需要安装相应的操作库.DatabaseLibrary是常用的库之一,它能兼容MySQL.Oracle ...

  6. springboot启动脚本

    #!/bin/sh JAVA_HOME="/ulic1/jdk/jdk1.8.0_201/bin" export JAVA_HOME lsof -i:9010 |awk '{pri ...

  7. [AGC028D](dp计数)

    题解点我 Code #include <bits/stdc++.h> typedef long long LL; typedef unsigned long long uLL; #defi ...

  8. Linux删除自带的openjdk,安装jdk1.8

    第一步:查看有哪些安装包 [root@localhost ~]# rpm -qa | grep javatzdata-java-2016g-2.el7.noarchpython-javapackage ...

  9. Linux忘记密码怎么办

    重启 Linux 系统主机并出现引导界面时,按下键盘上的 e 键进入内核编辑界面 在 linux16 参数这行的最后面追加"rd.break"参数,然后按下 Ctrl + X 组合 ...

  10. zabbix4.0短信告警配置

    #!/usr/bin/env python3 import requests import sys #http://utf8.api.smschinese.cn/?Uid=USERNAME&K ...