大致题意:

n场比赛,k个钱币。赢一场获得一个钱币,输一场失去一个钱币,一旦钱币数量为2k个或者0个,就马上离开比赛。给出n个长度字符串,由W,D,L,?四个字符组成,W表示赢,L表示输,D表示平局,?表示前三种情况的一种。

问此字符串是否是合法的赛事,如果合法,输出其中任意一种情况。

分析:

状态定义:d[i][j]表示前i场比赛,W-L=j,是否合法,合法为1,不合法为0

状态转移:if(s[i]=='D') d[i][j]=d[i-1][j];

else if(s[i]=='W') d[i][j]=d[i-1][j-1];

else if(s[i]=='L') d[i][j]=d[i-1][j+1];

else d[i][j]=max(max(d[i-1][j-1],d[i-1][j+1]),d[i-1][j]);

输出路径从尾至头遍历,因为当前状态合法,必定会有一个可转移至当前状态的之前的状态也合法,注意下赢输的差值不要为边界值就行了。

#include <bits/stdc++.h>
using namespace std; const int maxn=1005;
char s[maxn],ans[maxn];
bool d[maxn][4*maxn]; void print_path(int ) int main()
{
// freopen("in.txt","r",stdin);
int n,k;
while(~scanf("%d%d",&n,&k))
{
scanf("%s",s+1);
int mid=2000;
memset(d,0,sizeof(d));
d[0][mid]=1;
for(int i=1; i<=n; i++)
{
for(int j=mid-k; j<=mid+k; j++)
{
if(i!=n && (j==mid-k || j==mid+k))
continue;
if(s[i]=='D') d[i][j]=d[i-1][j];
else if(s[i]=='W') d[i][j]=d[i-1][j-1];
else if(s[i]=='L') d[i][j]=d[i-1][j+1];
else d[i][j]=max(max(d[i-1][j-1],d[i-1][j+1]),d[i-1][j]);
}
}
if(!d[n][mid-k] && !d[n][mid+k])
{
printf("NO\n");
continue;
}
if(d[n][mid-k])
{
int tmp=mid-k;
ans[n+1]=0;
for(int i=n; i>=1; i--)
{
if(s[i]!='?')
{
ans[i]=s[i];
if(s[i]=='L') tmp++;
else if(s[i]=='W') tmp--;
}
else
{
if(d[i-1][tmp] && tmp!=mid-k && tmp!=mid+k)
ans[i]='D';
else if(d[i-1][tmp+1] && tmp+1>mid-k && tmp+1<mid+k)
{
ans[i]='L';
tmp++;
}
else if(d[i-1][tmp-1] && tmp-1>mid-k && tmp-1<mid+k)
{
ans[i]='W';
tmp--;
}
}
}
printf("%s\n",ans+1);
continue;
}
if(d[n][mid+k])
{
int tmp=mid+k;
ans[n+1]=0;
for(int i=n; i>=1; i--)
{
if(s[i]=='L' || s[i]=='W' || s[i]=='D')
{
ans[i]=s[i];
if(s[i]=='L') tmp++;
else if(s[i]=='W') tmp--;
}
else
{
if(d[i-1][tmp] && tmp!=mid-k && tmp!=mid+k)
ans[i]='D';
else if(d[i-1][tmp+1] && tmp+1>mid-k && tmp+1<mid+k)
{
ans[i]='L';
tmp++;
}
else if(d[i-1][tmp-1] && tmp-1>mid-k && tmp-1<mid+k)
{
ans[i]='W';
tmp--;
}
}
}
printf("%s\n",ans+1);
}
}
return 0;
}

最新文章

  1. DS实验题 融合软泥怪-1
  2. OpenGL官方教程——着色器语言概述
  3. 20145206《Java程序设计》实验二Java面向对象程序设计实验报告
  4. 实例介绍Cocos2d-x中Box2D物理引擎:使用关节
  5. HDU 5876 Sparse Graph 【补图最短路 BFS】(2016 ACM/ICPC Asia Regional Dalian Online)
  6. STM32F2系列系统时钟默认配置
  7. Linux 添加Nginx 到 service 启动
  8. MySQL查询性能优化一则
  9. 利用mybatis-generator自动生成代码,发生:Plugin execution not covered by lifecycle configuration后解决方案
  10. find命令高级参数
  11. win32gui.Findwindow(parm1,parm2)查找窗口的句柄方法
  12. 微信公众号自定义菜单中添加emoji表情
  13. MySQL针对Swap分区的运维注意点
  14. bash常识
  15. discuz修改太阳,月亮,星星等级图标
  16. 大量原创视频教程分享(01)---XSL语法教程
  17. 通用性好的win2003序列号: (推荐先用这个里面的)
  18. sql中的分页实现
  19. moodle搭建相关的笔记
  20. Dirichlet Process

热门文章

  1. 使用find命令查找大文件
  2. 强哥CSS学习笔记
  3. Zabbix5.0服务端部署
  4. 046.Python协程
  5. xshell 终端 中文乱码
  6. 第一天:python学习-基础-计算机简史
  7. lambda 函数执行流程 递归注意
  8. Windows 10, version 21H1 ARM64
  9. macOS Big Sur 11.4 (20F71) 正式版(DMG、ISO、IPSW),百度网盘下载
  10. AlexeyAB DarkNet YOLOv3框架解析与应用实践(四)