codeforces 830E dp
大致题意:
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的更多相关文章
- Two Melodies CodeForces - 813D (DP,技巧)
https://codeforces.com/problemset/problem/813/D dp[i][j] = 一条链以i结尾, 另一条链以j结尾的最大值 关键要保证转移时两条链不能相交 #in ...
- Consecutive Subsequence CodeForces - 977F(dp)
Consecutive Subsequence CodeForces - 977F 题目大意:输出一序列中的最大的连续数列的长度和与其对应的下标(连续是指 7 8 9这样的数列) 解题思路: 状态:把 ...
- codeforces的dp专题
1.(467C)http://codeforces.com/problemset/problem/467/C 题意:有一个长为n的序列,选取k个长度为m的子序列(子序列中不能有位置重复),求所取的k个 ...
- Codeforces 721C [dp][拓扑排序]
/* 题意:给你一个有向无环图.给一个限定t. 问从1点到n点,在不超过t的情况下,最多可以拜访几个点. 保证至少有一条路时限不超过t. 思路: 1.由无后向性我们可以知道(取决于该图是一个DAG), ...
- CodeForces 607C (DP) Hard problem
题目:这里 题意:给定n个字符串,每个字符串可以进行一项操作,就是将这个字符串交换,就是该字符串的第一个和最后一个交换,第二个和倒数第二个交换,以此类推,当然可以选择对于 该字符串进行或不进行这项操作 ...
- Codeforces 611d [DP][字符串]
/* 题意:给一个长度不超过5000的字符串,每个字符都是0到9的数字. 要求将整个字符串划分成严格递增的几个数字,并且不允许前导零. 思路: 1.很开心得发现,当我在前i个区间以后再加一个区间的时候 ...
- Codeforces 404D [DP]
/* 我是一个习惯后悔,但是没办法忍受内疚感的二货== 这题是个无脑dp,但是比赛大概20min没出...其实最后5min我好好想想简单化边界条件,可以出的. 题意: 给你一个长度为1e6的由?*01 ...
- Codeforces 119C DP
题意: 有n天,m门课和常数k; 每天上一门课,每门课程有两个属性,最少作业量a,最多作业量b,和难度c. 1<=a<=b<=1e16 c<=100 1<=n<=m ...
- Codeforces 1096F(dp + 树状数组)
题目链接 题意: 对于长度为$n$的排列,在已知一些位的前提下求逆序对的期望 思路: 将答案分为$3$部分 $1.$$-1$与$-1$之间对答案的贡献.由于逆序对考虑的是数字之间的大小关系,故假设$- ...
随机推荐
- vim使用基础
vi/vim编辑器使用 前言 There is an old joke about a visitor to New York City asking a passerby for direction ...
- ssh判断免密登陆
ssh判断免密登陆 [root@jenkins ~]# vi /opt/release_code.sh #!/bin/bash . /etc/init.d/functions #echo $WORKS ...
- bond0 配置ip不生效排查方法
今天巡检的时候,发现无法连接到服务器上面了,于是到机房连接到显示器查看: 1.先检查网卡,协议有没有问题. 2.远程链接的网卡名称是bond0,用ifconfig看看网卡配置,然后发现配置的 ...
- Scala 函数式编程思想
Spark 选择 Scala 作为开发语言 在 Spark 诞生之初,就有人诟病为什么 AMP 实验室选了一个如此小众的语言 - Scala,很多人还将原因归结为学院派的高冷,但后来事实证明,选择 S ...
- Python对比两个txt文件内容
difflib模块作为python的标准库模块,无需安装,作用是比对文本之间的差异,且支持输出可读性比较强的html格式.#!coding=utf-8 # 2018-9-19 import sys i ...
- 10.10 traceroute:追踪数据传输路由状况
traceroute命令 用于显示网络数据包传输到指定主机的路径信息,追踪数据传输路由状况.默认数据包大小是60字节(IPv4)或80字节(IPv6),用户可另行设置.它与Windows下的trace ...
- JS实现前台表格排序功能
JS实现前台表格排序功能 虽然数据量不大的情况下,前台排序速度比较快,但一般情况下,我们的项目只使用后台排序,原因有二: 一是代码简单:二是前台JS排序对于有分页的情况无法处理. 前段时间,有个功能需 ...
- [ Java面试题 ]Java 开发岗面试知识点解析
如背景中介绍,作者在一年之内参加过多场面试,应聘岗位均为 Java 开发方向. 在不断的面试中,分类总结了 Java 开发岗位面试中的一些知识点. 主要包括以下几个部分: Java 基础知识点 Jav ...
- 能够划分局域网的VLAN
VLAN与三层交换机 1. VLAN的概述与优势 1.1 分割广播域 1.2 VLAN的优势 2. VLAN的种类 2.1 静态VLAN 2.2 动态VLAN 3. VLAN的ID 4.三层交换机转发 ...
- 向Relay添加算子
向Relay添加算子 为了在Relay IR中使用TVM算子,需要在Relay中注册算子,以确保将其集成到Relay的类型系统中. 注册算子需要三个步骤: 使用RELAY_REGISTER_OPC + ...