Codeforces 803E--Roma and Poker (DP)
原题链接:http://codeforces.com/problemset/problem/803/E
题意:给一个n长度的字符串,其中'?'可以替换成'D'、'W'、'L'中的任意一种,'D'等价于0, 'W'等价于1、'L'等价于-1。输出所有'?'被替换掉后,W和L的数目之差为k,且任意一个[1, i]的子串中W和L数目之差不能等于k。
思路:用DP做。定义bool dp[i][j]代表前i个字符W和L数目之差为j, -k<=j<=k(在数组中范围为[0, 2*k]),那么当str[i]为'D'时dp[i][j]转移到dp[i-1][j], 为'W'时dp[i][j]转移到dp[i-1][j+1], str[i]为'D'时dp[i][j]转移到dp[i-1][j-1], 初始值dp[0][0]为true。
接着用一遍dfs倒推求结果,注意字符加的位置。
AC代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<string>
using namespace std;
int dp[][];
int n,k;
string str;
void change(int i, int L, int D, int W){
for(int j=;j<*k;j++){
if(dp[i-][j]){
if(D) dp[i][j]=;
if(L){
if(i!=n&&j-==)//[1, i]子串中W和L数目之差不能等于k
continue;
dp[i][j-]=;
}
if(W){
if(i!=n&&j+==*k)
continue;
dp[i][j+]=;
}
}
}
return;
}
string ss;
//int t=0;
bool res(int i, int j, string ans){
//t++;
if(i==&&j==k){
ss=ans;
return ;
}
if(str[i-]!='?'){
if(str[i-]=='D') return res(i-, j, 'D'+ans);
if(str[i-]=='W') return res(i-, j-, 'W'+ans);
if(str[i-]=='L') return res(i-, j+, 'L'+ans);
}
else
{
if(dp[i-][j]&&res(i-, j, 'D'+ans)) return ;
if(dp[i-][j-]&&res(i-, j-, 'W'+ans)) return ;
if(dp[i-][j+]&&res(i-, j+, 'L'+ans)) return ;
} return ;
}
int main()
{
while(cin>>n>>k)
{
memset(dp, , sizeof(dp));
dp[][k]=;
cin>>str;
if(str[n-]=='D'){
cout<<"NO"<<endl;
continue;
}
for(int i=;i<=n;i++){
if(str[i-]=='?')
change(i, , , );
else if(str[i-]=='D')
change(i, , , );
else if(str[i-]=='W')
change(i, , , );
else
change(i, , , );
}
string ans;
if(dp[n][]){
res(n, , ans);
cout<<ss<<endl;
}
else if(dp[n][*k]){
res(n, *k, ans);
cout<<ss<<endl;
}
else
cout<<"NO"<<endl;
//cout<<t<<endl;
}
return ;
}
这代码调了我好久啊QAQ,感觉自己真菜
Codeforces 803E--Roma and Poker (DP)的更多相关文章
- Educational Codeforces Round 20 E - Roma and Poker(dp)
传送门 题意 Roma在玩一个游戏,一共玩了n局,赢则bourle+1,输则bourle-1,Roma将会在以下情况中退出 1.他赢了k个bourle 2.他输了k个bourle 现在给出一个字符串 ...
- Codeforces 803E - Roma and Poker
http://codeforces.com/problemset/problem/803/E E. Roma and Poker time limit per test 2 se ...
- CodeForces - 710E Generate a String (dp)
题意:构造一个由a组成的串,如果插入或删除一个a,花费时间x,如果使当前串长度加倍,花费时间y,问要构造一个长度为n的串,最少花费多长时间. 分析:dp[i]---构造长度为i的串需要花费的最短时间. ...
- Educational Codeforces Round 51 D. Bicolorings(dp)
https://codeforces.com/contest/1051/problem/D 题意 一个2*n的矩阵,你可以用黑白格子去填充他,求联通块数目等于k的方案数,答案%998244353. 思 ...
- Codeforces 536D - Tavas in Kansas(dp)
Codeforces 题目传送门 & 洛谷题目传送门 其实这题本该 2019 年 12 月就 AC 的(详情请见 ycx 发此题题解的时间),然鹅鸽到了现在-- 首先以 \(s,t\) 分别为 ...
- Codeforces 295D - Greg and Caves(dp)
题意: 给出一个 \(n \times m\) 的矩阵,需对其进行黑白染色,使得以下条件成立: 存在区间 \([l,r]\)(\(1\leq l\leq r\leq n\)),使得第 \(l,l+1, ...
- Codeforces 467C George and Job(DP)
题目 Source http://codeforces.com/contest/467/problem/C Description The new ITone 6 has been released ...
- Codeforces A ACM (ACronym Maker) (dp)
http://codeforces.com/gym/100650 概要:给出一个缩写,和一些单词,从单词中按顺序选一些字母作为缩写,问方案数. 限制:某些单词要忽略,每个单词至少要选一个字母. dp[ ...
- codeforces 813 D. Two Melodies(dp)
题目链接:http://codeforces.com/contest/813/problem/D 题意:求两个不相交的子集长度之和最大是多少,能放入同一子集的条件是首先顺序不能变,然后每一个相邻的要么 ...
随机推荐
- Share架构的一些心得
个人这些年,从web->system service->app 项目实战,陆陆续续经历的项目很多,自己也数不清.自己也一直对于架构没有明确去给出一个自己的定义描述. 刚好最近一直在flut ...
- Linux 两台服务器之间传递文件
参考: https://www.cnblogs.com/clovershell/p/9870603.html linux采用scp命令拷贝文件到本地,拷贝本地文件到远程服务器 // 假设远程服务器 ...
- 004-URL编码转换函数:escape()、encodeURI()、encodeURIComponent()
一.概述 函数出现时间: escape() javascript 1.0 ...
- Vagrant 手册之同步目录 - VirtualBox
原文地址 如果你使用的 provider 是 VirtualBox,那么 VirtualBox 同步目录就是默认的同步目录类型.这些同步目录使用 VirtualBox 的共享目录系统来同步客户机跟宿主 ...
- 题解1235. 洪水 (Standard IO)
Description 一天, 一个画家在森林里写生,突然爆发了山洪,他需要尽快返回住所中,那里是安全的.森林的地图由R行C列组成,空白区域用点“.”表示,洪水的区域用“*”表示,而岩石用“X”表示, ...
- 结合Pool进程池进程,实现进程之间的通讯,稍微复杂的运用
#进程池中的Queue """ 如果要用Pool创建进程,就需要multiprocessing.Manager()中的Queue() 而不是multiprocessing ...
- SAS去空格
data test; x=" aaa bbb hahaha"; x1=compress(x); x2=left(x); p ...
- mysql高级知识
2 数据约束 2.1什么数据约束 对用户操作表的数据进行约束 2.2 默认值 作用: 当用户对使用默认值的字段不插入值的时候,就使用默认值. 注意: 1)对默认值字段插入null是可以的. 2)对 ...
- [HDU 3625]Examining the Rooms (第一类斯特林数)
[HDU 3625]Examining the Rooms (第一类斯特林数) 题面 有n个房间,每个房间有一个钥匙,钥匙等概率的出现在n个房间内,每个房间中只会出现且仅出现一个钥匙.你能炸开门k次, ...
- flex布局解说和属性
1. flex-direction 规定当前DIV下面的子元素是横向布局还是纵向布局 row 默认值,横向布局相当于float:left column 纵向,相当于DIV默认的垂直方向 2.justi ...