大致题意:

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

codeforces 830E dp的更多相关文章

  1. Two Melodies CodeForces - 813D (DP,技巧)

    https://codeforces.com/problemset/problem/813/D dp[i][j] = 一条链以i结尾, 另一条链以j结尾的最大值 关键要保证转移时两条链不能相交 #in ...

  2. Consecutive Subsequence CodeForces - 977F(dp)

    Consecutive Subsequence CodeForces - 977F 题目大意:输出一序列中的最大的连续数列的长度和与其对应的下标(连续是指 7 8 9这样的数列) 解题思路: 状态:把 ...

  3. codeforces的dp专题

    1.(467C)http://codeforces.com/problemset/problem/467/C 题意:有一个长为n的序列,选取k个长度为m的子序列(子序列中不能有位置重复),求所取的k个 ...

  4. Codeforces 721C [dp][拓扑排序]

    /* 题意:给你一个有向无环图.给一个限定t. 问从1点到n点,在不超过t的情况下,最多可以拜访几个点. 保证至少有一条路时限不超过t. 思路: 1.由无后向性我们可以知道(取决于该图是一个DAG), ...

  5. CodeForces 607C (DP) Hard problem

    题目:这里 题意:给定n个字符串,每个字符串可以进行一项操作,就是将这个字符串交换,就是该字符串的第一个和最后一个交换,第二个和倒数第二个交换,以此类推,当然可以选择对于 该字符串进行或不进行这项操作 ...

  6. Codeforces 611d [DP][字符串]

    /* 题意:给一个长度不超过5000的字符串,每个字符都是0到9的数字. 要求将整个字符串划分成严格递增的几个数字,并且不允许前导零. 思路: 1.很开心得发现,当我在前i个区间以后再加一个区间的时候 ...

  7. Codeforces 404D [DP]

    /* 我是一个习惯后悔,但是没办法忍受内疚感的二货== 这题是个无脑dp,但是比赛大概20min没出...其实最后5min我好好想想简单化边界条件,可以出的. 题意: 给你一个长度为1e6的由?*01 ...

  8. Codeforces 119C DP

    题意: 有n天,m门课和常数k; 每天上一门课,每门课程有两个属性,最少作业量a,最多作业量b,和难度c. 1<=a<=b<=1e16 c<=100 1<=n<=m ...

  9. Codeforces 1096F(dp + 树状数组)

    题目链接 题意: 对于长度为$n$的排列,在已知一些位的前提下求逆序对的期望 思路: 将答案分为$3$部分 $1.$$-1$与$-1$之间对答案的贡献.由于逆序对考虑的是数字之间的大小关系,故假设$- ...

随机推荐

  1. linux下获取占用CPU资源最多的10个进程,可以使用如下命令组合:

    linux下获取占用CPU资源最多的10个进程,可以使用如下命令组合: ps aux|head -1;ps aux|grep -v PID|sort -rn -k +3|head linux下获取占用 ...

  2. BUUCTF(十一)[极客大挑战 2019]Knife

    BUUCTF系列 想着应该不会这么简单吧... 结果就是这么简单ee 疯狂暗示... url:xxx/index.php 密码:Syc 连接成功... cd / ls cat flag

  3. VMware安装RedHat7、CentOS7后无网卡解决办法

    由于Vmware虚拟网卡和linux兼容问题导致驱动无法正常安装,默认的网卡类型不兼容找到我们的Vmware虚拟机文件夹,将VMware 虚拟机配置 (.vmx),追加一条设置,网卡类型etherne ...

  4. HDFS 的内存存储是什么?

    引言 HDFS 的定位就是一个文件系统,用于存储文件,而 HDFS 对于文件的存储方式有两种: 内存存储 异构存储 内存存储 什么是内存存储? 首先,我们来了解一下到底什么是 "内存存储&q ...

  5. session.flush()与session.clear()区别与使用环境

    session是有一级缓存的,目的是为了减少查询数据库的时间,提高效率,生命周期与session是一样的 session.flush() 是将session的缓存中的数据与数据库同步 事物提交失败 缓 ...

  6. 阿里云RDs 网络白名单 专用网络 经典网络

    云服务为了安全性总是有不同的安全规则,第一就是需要明白里面的网络类型   专有网络是您自己独有的云上私有网络.您可以完全掌控自己的专有网络,例如选择IP地址范围.配置路由表和网关等,您可以在自己定义的 ...

  7. Docker学习(6) 获取和推送镜像

    查找镜像 拉取镜像 推送镜像 总结

  8. AI推理与Compiler

    AI推理与Compiler AI芯片编译器能加深对AI的理解, AI芯片编译器不光涉及编译器知识,还涉及AI芯片架构和并行计算如OpenCL/Cuda等.如果从深度学习平台获得IR输入,还需要了解深度 ...

  9. 嵌入式Linux的OTA更新,基础知识和实现

    嵌入式Linux的OTA更新,第1部分-基础知识和实现 OTA updates for Embedded Linux,  Fundamentals and implementation 更新的需要 一 ...

  10. 【Java面试真题】剑指Offer53.2——0~n-1中缺失的数字(异或、二分两种解法)

    [Java实现]剑指Offer53.2--0~n-1中缺失的数字:面试真题,两种思路分享 前面有另一道面试题[Java实现]剑指offer53.1--在排序数组中查找数字(LeetCode34:在排序 ...