传送门

题意

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;
}

最新文章

  1. 级联两个bootstrap-table。一张表显示相关的数据,通过点击这张表的某一行,传过去对应的ID,刷新另外一张表。
  2. express 框架之session
  3. JavaScript学习笔记-对象
  4. bzoj 2809: [Apio2012]dispatching
  5. 关于module_param()宏
  6. Android 保存联系人,包括部门\职位\传真\地址\照片
  7. C++ STL之list容器的基本操作
  8. SQL Server自动化运维系列 - 多服务器数据收集和性能监控
  9. 简易浏览器App webview
  10. iOS 的 APP 在系统中如何适配不同的屏幕的尺寸
  11. 【Linux&amp;amp;Unix--open/close/write/read系统调用】
  12. Ninject的项目情况
  13. go语言模版编程
  14. emacs 文本替换
  15. Appium+Python自动化 2 定位元素方式
  16. jdk环境变量配置注意事项
  17. adduser Ubuntu添加sudo用户
  18. vue展示dicom文件,医疗系统。
  19. Ruby 基础教程 第一部分总结
  20. Delphi XE5 for Android (四)

热门文章

  1. 用C++实现一个Log系统
  2. lua 暂停写法
  3. 【iOS】KVC 与 KVO
  4. c++面试题总结(4)
  5. 【转载】VS工具使用&mdash;&mdash;代码图
  6. Android的Message Pool是个什么鬼,Message Pool会否引起OOM——源代码角度分析
  7. nfs 挂载错误
  8. mysql insert操作
  9. eclipse配置android
  10. Hadoop每日一讨论整理版