原题链接: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代码:

  1. #include<iostream>
  2. #include<cstring>
  3. #include<cstdio>
  4. #include<string>
  5. using namespace std;
  6. int dp[][];
  7. int n,k;
  8. string str;
  9. void change(int i, int L, int D, int W){
  10. for(int j=;j<*k;j++){
  11. if(dp[i-][j]){
  12. if(D) dp[i][j]=;
  13. if(L){
  14. if(i!=n&&j-==)//[1, i]子串中W和L数目之差不能等于k
  15. continue;
  16. dp[i][j-]=;
  17. }
  18. if(W){
  19. if(i!=n&&j+==*k)
  20. continue;
  21. dp[i][j+]=;
  22. }
  23. }
  24. }
  25. return;
  26. }
  27. string ss;
  28. //int t=0;
  29. bool res(int i, int j, string ans){
  30. //t++;
  31. if(i==&&j==k){
  32. ss=ans;
  33. return ;
  34. }
  35. if(str[i-]!='?'){
  36. if(str[i-]=='D') return res(i-, j, 'D'+ans);
  37. if(str[i-]=='W') return res(i-, j-, 'W'+ans);
  38. if(str[i-]=='L') return res(i-, j+, 'L'+ans);
  39. }
  40. else
  41. {
  42. if(dp[i-][j]&&res(i-, j, 'D'+ans)) return ;
  43. if(dp[i-][j-]&&res(i-, j-, 'W'+ans)) return ;
  44. if(dp[i-][j+]&&res(i-, j+, 'L'+ans)) return ;
  45. }
  46.  
  47. return ;
  48. }
  49. int main()
  50. {
  51. while(cin>>n>>k)
  52. {
  53. memset(dp, , sizeof(dp));
  54. dp[][k]=;
  55. cin>>str;
  56. if(str[n-]=='D'){
  57. cout<<"NO"<<endl;
  58. continue;
  59. }
  60. for(int i=;i<=n;i++){
  61. if(str[i-]=='?')
  62. change(i, , , );
  63. else if(str[i-]=='D')
  64. change(i, , , );
  65. else if(str[i-]=='W')
  66. change(i, , , );
  67. else
  68. change(i, , , );
  69. }
  70. string ans;
  71. if(dp[n][]){
  72. res(n, , ans);
  73. cout<<ss<<endl;
  74. }
  75. else if(dp[n][*k]){
  76. res(n, *k, ans);
  77. cout<<ss<<endl;
  78. }
  79. else
  80. cout<<"NO"<<endl;
  81. //cout<<t<<endl;
  82. }
  83. return ;
  84. }

这代码调了我好久啊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. 在Python中操作文件之truncate()方法的使用教程

    在Python中操作文件之truncate()方法的使用教程 这篇文章主要介绍了在Python中操作文件之truncate()方法的使用教程,是Python入门学习中的基础知识,需要的朋友可以参考下 ...

  2. Drone 中的概念:webhooks、workspace、cloning、pipelines、services、plugins、deployments

    webhooks 跳过提交 包含/跳过分支 branches workspace base 属性 path 属性 cloning pipelines 构建步骤 并行执行 group 条件执行 when ...

  3. 关于 推广QQ

    有一个项目 需要在用户提交表单之后,关闭页面,微信公众号发送一个模板消息,链接地址为qq推广的链接. 早上在试 先是在电脑端测试都是正常的. 然后开始上传到服务器端测试,发送模板消息之前的动作,都没有 ...

  4. 为什么有mac地址还学要有IP地址??

    历史原因:早期的以太网只有集线器 ,没有交换机,所以发出去的包能被以太网内的所有机器监听到,因此要附带上MAC地址,每个机器只需要接受与自己MAC地址相匹配的包. 个人感觉上面的说法并不是太准确.找明 ...

  5. 【ABAP系列】SAP ABAP模块-查找系统出口或BADI的方法

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP模块-查找系统出 ...

  6. linux flock()

    表头文件  #include<sys/file.h> 定义函数  int flock(int fd,int operation); 函数说明  flock()会依参数operation所指 ...

  7. HTML/CSS点滴记录

    1. overflow 定义溢出元素内容区的内容会如何处理 visible 默认值.内容不会被修剪,会呈现在元素框之外. hidden 内容会被修剪,并且其余内容是不可见的. scroll 内容会被修 ...

  8. Java中的类修饰符

    资料主要来源于网络(http://60.28.60.3/zy/java-new/zhishidian/chap3/3.htm) 之前每次写小测试程序的时候,总是把一个类放在一个Java文件中,按理说这 ...

  9. 《STL源码剖析》——第五、六:关联容器与算法

    第五章.关联容器  5.0.关联容器 标准的STL关联式容器分为set(集合)和map(映射表)两大类,以及这两大类的衍生体multiset(多键集合)和multimap(多键映射表).这些容器的底层 ...

  10. [暑假集训Day3T3]平板涂色

    同样是搜索经典题. 优化并不多,只需在当前步数已经大于目前答案时剪枝就可以了. 此题重点在于如何判断第k个矩形能不能选. 设矩形i的左上坐标为i(squ[i].upx,squ[i].upy),右下角坐 ...