原题链接: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[2005][4005];
 7 int n,k;
 8 string str;
 9 void change(int i, int L, int D, int W){
10         for(int j=1;j<2*k;j++){
11             if(dp[i-1][j]){
12                 if(D) dp[i][j]=1;
13                 if(L){
14                     if(i!=n&&j-1==0)//[1, i]子串中W和L数目之差不能等于k
15                         continue;
16                     dp[i][j-1]=1;
17                 }
18                 if(W){
19                     if(i!=n&&j+1==2*k)
20                         continue;
21                     dp[i][j+1]=1;
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==0&&j==k){
32         ss=ans;
33         return 1;
34     }
35     if(str[i-1]!='?'){
36         if(str[i-1]=='D') return res(i-1, j, 'D'+ans);
37         if(str[i-1]=='W') return res(i-1, j-1, 'W'+ans);
38         if(str[i-1]=='L') return res(i-1, j+1, 'L'+ans);
39     }
40     else
41     {
42         if(dp[i-1][j]&&res(i-1, j, 'D'+ans)) return 1;
43         if(dp[i-1][j-1]&&res(i-1, j-1, 'W'+ans)) return 1;
44         if(dp[i-1][j+1]&&res(i-1, j+1, 'L'+ans)) return 1;
45     }
46
47     return 0;
48 }
49 int main()
50 {
51     while(cin>>n>>k)
52     {
53         memset(dp, 0, sizeof(dp));
54         dp[0][k]=1;
55         cin>>str;
56         if(str[n-1]=='D'){
57             cout<<"NO"<<endl;
58             continue;
59         }
60         for(int i=1;i<=n;i++){
61             if(str[i-1]=='?')
62                 change(i, 1, 1, 1);
63             else if(str[i-1]=='D')
64                 change(i, 0, 1, 0);
65             else if(str[i-1]=='W')
66                 change(i, 0, 0, 1);
67             else
68                 change(i, 1, 0, 0);
69         }
70         string ans;
71         if(dp[n][0]){
72             res(n, 0, ans);
73             cout<<ss<<endl;
74         }
75         else if(dp[n][2*k]){
76             res(n, 2*k, ans);
77             cout<<ss<<endl;
78         }
79         else
80             cout<<"NO"<<endl;
81         //cout<<t<<endl;
82     }
83     return 0;
84 }

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

转载于:https://www.cnblogs.com/MasterSpark/p/7450853.html

Codeforces 803E--Roma and Poker (DP)相关推荐

  1. Codeforces Round #791 (Div. 2)(A-D)

    Codeforces Round #791 (Div. 2)(A-D) A. AvtoBus 题意: 给你 n, 问满足 4x+6y=n4x+6y=n4x+6y=n 的 x+yx+yx+y的最小值和最 ...

  2. 求三角形最大面积(DP)

    求三角形最大面积(DP) 在OJ上奇迹般WA了:WA:70. Why? #include <iostream> #include <string.h> using namesp ...

  3. LeetCode 编辑距离 II(DP)

    1. 题目 给你两个单词 s 和 t,请你计算出将 s 转换成 t 所使用的最少操作数. 你可以对一个单词进行如下两种操作: 删除一个字符 替换一个字符 注意: 不允许插入操作 题目保证有解 示例: ...

  4. LeetCode 1220. 统计元音字母序列的数目(DP)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个整数 n,请你帮忙统计一下我们可以按下述规则形成多少个长度为 n 的字符串: - 字符串中的每个字符都应当是小写元音字母('a', 'e', 'i ...

  5. LeetCode 265. 粉刷房子 II(DP)

    文章目录 1. 题目 2. 解题 1. 题目 假如有一排房子,共 n 个,每个房子可以被粉刷成 k 种颜色中的一种,你需要粉刷所有的房子并且使其相邻的两个房子颜色不能相同. 当然,因为市场上不同颜色油 ...

  6. LeetCode 256. 粉刷房子(DP)

    文章目录 1. 题目 2. 解题 1. 题目 假如有一排房子,共 n 个,每个房子可以被粉刷成红色.蓝色或者绿色这三种颜色中的一种,你需要粉刷所有的房子并且使其与相邻的两个房子颜色不能相同. 当然,因 ...

  7. LeetCode 1223. 掷骰子模拟(DP)

    1. 题目 有一个骰子模拟器会每次投掷的时候生成一个 1 到 6 的随机数. 不过我们在使用它时有个约束,就是使得投掷骰子时,连续 掷出数字 i 的次数不能超过 rollMax[i](i 从 1 开始 ...

  8. LeetCode 1155. 掷骰子的N种方法(DP)

    1. 题目 这里有 d 个一样的骰子,每个骰子上都有 f 个面,分别标号为 1, 2, -, f. 我们约定:掷骰子的得到总点数为各骰子面朝上的数字的总和. 如果需要掷出的总点数为 target,请你 ...

  9. LeetCode 1139. 最大的以 1 为边界的正方形(DP)

    1. 题目 给你一个由若干 0 和 1 组成的二维网格 grid,请你找出边界全部由 1 组成的最大 正方形 子网格,并返回该子网格中的元素数量.如果不存在,则返回 0. 示例 1: 输入:grid ...

最新文章

  1. 纯CSS3实现宽屏二级下拉菜单
  2. C#中new和override的区别
  3. postgresql集群方案hot standby初级测试(二) ——处理数据能力
  4. 通过数据扩充来扩展数据集
  5. 严防ARP病毒的六个步骤
  6. ffmpeg和SDL教程 04:创建线程
  7. css3-13 css3的3D动画如何实现
  8. java Math.random()
  9. C#将日期转化成英文
  10. 为什么女程序员那么少,我觉得程序员应该是最适合女性的职位
  11. 引爆5G市场,场景为王?
  12. 四路组相联原理_计算机组成原理中是如何求是几路组相联映像?
  13. Typora常用快捷键(详细)
  14. 塑胶模具设计-双色注塑模具设计36条经典经验分享
  15. 燕山大学计算机历年拟录取分数线,燕山大学录取分数线2021是多少分(附历年录取分数线)...
  16. java string转short_java类型转换
  17. Spring三大核心思想之AOP(面向切面编程)
  18. svn发布网站(转载于badb0y)
  19. 武汉大学计算机黄天成,UCL南区决赛武大强势夺得LOL冠军 韩国外援成焦点
  20. (专升本)数字多媒体技术基础(图形/图像处理软件)

热门文章

  1. php取json子对象属性,php中输出json对象的值(实现方法)
  2. 双稳态继电器工作原理图_固态继电器只有单一的作用吗?带你了解不一样的固态继电器...
  3. ASP.NET Core Web 应用程序系列(一)- 使用ASP.NET Core内置的IoC容器DI进行批量依赖注入(MVC当中应用)...
  4. C#入门详解(14)
  5. 【IT界的厨子】酱香鲈鱼
  6. nyoj164——卡特兰数(待填坑)
  7. Hadoop学习笔记—8.Combiner与自定义Combiner
  8. ETL作业调度软件TASKCTL自定义扩展作业类型插件安装
  9. 实体类和数据表的映射异常(XXX is not mapping[ ])
  10. 概率论与数理统计-ch8-假设检验