传送门

题意

Roma在玩一个游戏,一共玩了n局,赢则bourle+1,输则bourle-1,Roma将会在以下情况中退出

1.他赢了k个bourle

2.他输了k个bourle

现在给出一个字符串

'L':lose

'W':win

'?':任意

'D':平局

输出一个字符串满足条件(Roma n局后离开要满足上述两个其中之一)

分析

dp题

令dp[i][j]表示进行i-1局比赛后,是否获得j个bourle。

如果第i局为'W': dp[i+1][j+1]=j;

如果第i局为'L':dp[i+1][j-1]=j;

如果第i局为'D':dp[i+1][j]=j;

如果第i局为'?':上面三个都要进行

一开始dp[0][1500]=0

最后从n-1到0,比较dp[i][f]与f,f一开始是1500±k,f=dp[i+1][f]

回溯判断输出

trick

代码

#include<cstdio>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std; string s;
int dp[1010][3030];
int n,k;
int main()
{
cin>>n>>k>>s;
for(int i=0;i<1010;++i)for(int j=0;j<3030;++j) dp[i][j]=-1;
dp[0][1500]=0;
for(int i=0;i<n;++i)
for(int j=1500-k+1;j<=1500+k-1;++j)
{
if(dp[i][j]==-1)continue;
if(s[i]=='W'||s[i]=='?') dp[i+1][j+1]=j;
if(s[i]=='L'||s[i]=='?') dp[i+1][j-1]=j;
if(s[i]=='D'||s[i]=='?') dp[i+1][j]=j;
}
if(dp[n][1500+k]==-1&&dp[n][1500-k]==-1) { puts("NO");return 0; }
int f=1500+k;
if(dp[n][1500+k]==-1) f=1500-k;
for(int i=n-1;i>=0;--i)
{
int g=f;f=dp[i+1][f];
if(g-f==1) s[i]='W';
if(g-f==0) s[i]='D';
if(g-f==-1) s[i]='L';
}
cout<<s<<endl;
return 0;
}

Educational Codeforces Round 20 E - Roma and Poker(dp)的更多相关文章

  1. Educational Codeforces Round 16 E. Generate a String (DP)

    Generate a String 题目链接: http://codeforces.com/contest/710/problem/E Description zscoder wants to gen ...

  2. Educational Codeforces Round 22 B. The Golden Age(暴力)

    题目链接:http://codeforces.com/contest/813/problem/B 题意:就是有一个数叫做不幸运数,满足题目的 n = x^a + y^b,现在给你一个区间[l,r],让 ...

  3. D Merge Equals Educational Codeforces Round 42 (Rated for Div. 2) (STL )

    D. Merge Equals time limit per test2 seconds memory limit per test256 megabytes inputstandard input ...

  4. Educational Codeforces Round 54 [Rated for Div. 2] (CF1076)

    第一次在宿舍打CF 把同宿舍的妹子吵得不行... 特此抱歉QAQ A 题意:给定一个字符串, 最多删掉一个字符,使得剩余字符串字典序最小 n<=2e5 当然"最多"是假的 删 ...

  5. Educational Codeforces Round 32:E. Maximum Subsequence(Meet-in-the-middle)

    题目链接:E. Maximum Subsequence 用了一个Meet-in-the-middle的技巧,还是第一次用到这个技巧,其实这个技巧和二分很像,主要是在dfs中,如果数量减小一半可以节约很 ...

  6. Codeforces Round #471 (Div. 2) F. Heaps(dp)

    题意 给定一棵以 \(1\) 号点为根的树.若满足以下条件,则认为节点 \(p\) 处有一个 \(k\) 叉高度为 \(m\) 的堆: 若 \(m = 1\) ,则 \(p\) 本身就是一个 \(k\ ...

  7. Codeforces Round #165 (Div. 1) Greenhouse Effect(DP)

    Greenhouse Effect time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...

  8. Codeforces Round #658 (Div. 2) D. Unmerge(dp)

    题目链接:https://codeforces.com/contest/1382/problem/D 题意 给出一个大小为 $2n$ 的排列,判断能否找到两个长为 $n$ 的子序列,使得二者归并排序后 ...

  9. Codeforces Round #652 (Div. 2) D. TediousLee(dp)

    题目链接:https://codeforces.com/contest/1369/problem/D 题意 最初有一个结点,衍生规则如下: 如果结点 $u$ 没有子结点,添加 $1$ 个子结点 如果结 ...

随机推荐

  1. XStream 数组(List)输出结构

    <!-- 期望的DOM树 --> <Articles> <item> <Title>微信SDK初步结构</Title> <Descri ...

  2. SolidEdge 如何绘制剖视图

    如果要创建剖视图,则点击切割平面按钮,然后绘制剖面线,画好之后点击完成   然后点击剖视图按钮,鼠标单击刚才的剖面线,往要的方向拖动,即可生成剖面视图   剖视图有时也需要用到旋转剖视图 如下图所示, ...

  3. VMWare 14 Workstation Pro 下载与安装

    1.双击安装运行 2.下一步 3.接受 下一步 4.自定义安装路径,下一步 5.下一步,取消勾选加入vmware客户体验 6.下一步 7.安装 8.安装中 9.完成 10.点击许可证安装 输入:FF3 ...

  4. linux输入子系统(5) - 学习框架

    注:本系列转自: http://www.ourunix.org/post/290.html input子系统学习系列文章,是我在实际开发过程中遇到也是必须啃下去的第一个Linux驱动,所以有必要记载下 ...

  5. xcode编译 debug版或release 版

    编译debug版本或release 版本 在Run和Stop按钮的右边有一个工程名 点击工程名,选择Manage Schemes 选择Edit... 左侧选择Run ProjectName.app 右 ...

  6. 【献给CWNU的师弟】Web篇

    2014年10月8日 献给CWNU的师弟

  7. WPF DataGrid获取选择行的数据

    在WPF中,单击DataGrid,如何获取当前点击的行? 比如在MouseDoubleClick事件中,事实上获取的选中行是一个DataRowview,你可以通过以下的方法来获取选中行的数据,需要引用 ...

  8. 检測磁盘驱动的健康程度SMART

    在server中,全部组件中一般最easy坏掉的就是磁盘.所以一般採取RAID来保证系统的稳定性,通过冗余磁盘的方式防止磁盘故障. 现代硬件驱动器一般支持SMART(自我监測分析和报告技术),它可以监 ...

  9. MapReduce算法形式二:去重(shuffle)

    案例二:去重(shuffle/HashSet等方法)shuffle主要针对的是key去重HashSet主要针对values去重

  10. oracle的索引有几种?各有何用途?

    1. b-tree索引Oracle数据库中最常见的索引类型是b-tree索引,也就是B-树索引,以其同名的计算科学结构命名.CREATE INDEX语句时,默认就是在创建b-tree索引.没有特别规定 ...