链接
http://codeforces.com/problemset/problem/803/E
题目大意
给你一坨字符串,其中
W
代表
让你安排下每个
题解
刚才还想说这是水题,但是我又一想:水题我不是也调了好长时间吗?
所以说,要提高代码能力。
f[i][j]
表示考虑前
i
个数时和为
暴力转移,记录决策。
代码
//动态规划
#include <cstdio>
#include <algorithm>
#define maxn 2017
using namespace std;
int N, K, f[maxn][maxn], d[maxn][maxn], t;
char s[maxn];
int main()
{
freopen("in.txt","r",stdin);
int i, j;
scanf("%d%d%s",&N,&K,s+1);
if(K>N){printf("NO");return 0;}
f[0][N]=1;
for(i=1;i<=N;i++)
{
for(j=0;j<=N<<1;j++)
{
if((j==N-K or j==N+K) and i!=N)continue;
if(s[i]=='W' and f[i-1][j-1])f[i][j]=1, d[i][j]=-1;
if(s[i]=='D' and f[i-1][j])f[i][j]=1, d[i][j]=0;
if(s[i]=='L' and f[i-1][j+1])f[i][j]=1, d[i][j]=1;
if(s[i]=='?')
{
if(f[i-1][j-1])f[i][j]=1, d[i][j]=-1;
if(f[i-1][j])f[i][j]=1, d[i][j]=0;
if(f[i-1][j+1])f[i][j]=1, d[i][j]=1;
}
}
}
if(!f[N][N-K] and !f[N][N+K]){printf("NO");return 0;}
if(f[N][N-K])t=N-K; else t=N+K;
for(i=N;i;i--)
{
if(d[i][t]==1)s[i]='L';
if(d[i][t]==0)s[i]='D';
if(d[i][t]==-1)s[i]='W';
t=t+d[i][t];
}
printf("%s",s+1);
return 0;
}