大致题意:

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. Docker Swarm(九)资源限制

    资源限制 docker run 針對限制容器資源有許多設置選項,但Swarm中的 docker service 是另一回事,目前只有cpu和memory的選項可以操作. 如果 docker 找不到足夠 ...

  2. 如果你想设置无人自动升级,我们推荐你将这个值修改为security,它会告诉 yum 仅仅升级修复安全问题的软件包。

    定期升级你的 CentOS 系统,是所有系统安全中最重要的措施之一.如果你不使用最新的安全补丁升级你的操作系统软件包,你将会让你的机器很容易被攻击. 如果你管理者多个 CentOS 机器,手动升级系统 ...

  3. 2017-11-20 崂应工作总结,含LTC3780模块分析,含运放原理

    学习了运算放大器的分类 运放的单点输入 差动模式 共模抑制输入模式 反相位比例运放 正相比例运放 电压跟随器 运放的放大比例计算 LTC3780模块的原理 因为: R19  这个电阻不确定他的接法 暂 ...

  4. 编写程序,计算当n=10000,20000,30000...100000时,π的值.求π的近似公式 π=4*(1-1/3+1/5-1/7+1/9-1/11+1/13-...+1/(2n-1)-1/(2n+1))

    该程序是求的 π 近似值,所以随着 i 的增大,值会无线接近于 3.1415926... 代码示例 : package judgment;/** * 编写程序,计算当n=10000,20000,300 ...

  5. 西门子 S7-200 通过以太网通讯模块连接MCGS 通讯

    北京华科远创科技有限研发的远创智控ETH-YC模块,以太网通讯模块型号有MPI-ETH-YC01和PPI-ETH-YC01,适用于西门子S7-200/S7-300/S7-400.SMART S7-20 ...

  6. 在windows上 使用celery 报错

    在windows上 使用celery 报错       在windows上 使用celery 报错 ValueError: not enough values to unpack (expected ...

  7. Step By Step(Lua迭代器和泛型for)

    Step By Step(Lua迭代器和泛型for) 1. 迭代器与Closure:    在Lua中,迭代器通常为函数,每调用一次函数,即返回集合中的"下一个"元素.每个迭代器都 ...

  8. 安装 error: Microsoft Visual C++ 14.0 is required 解决方案

    最近写的项目需要用到Python的第三方库,比如:mmh3, pyshark等等,而直接pip install ... 会报错:error: Microsoft Visual C++ 14.0 is ...

  9. 云ERP真的已经玩不转了吗?

    欢迎关注微信公众号:sap_gui (ERP咨询顾问之家) 注:以下云ERP特指Saas ERP,非指ERP系统部署在云端. 不得不说,如今市场对传统ERP的接受度要远比云ERP高得多,95%的中大型 ...

  10. TVM优化GPU机器翻译

    TVM优化GPU机器翻译 背景 神经机器翻译(NMT)是一种自动化的端到端方法,具有克服传统基于短语的翻译系统中的弱点的潜力.最近,阿里巴巴集团正在为全球电子商务部署NMT服务. 将Transform ...