字符串DP cf803E

http://codeforces.com/problemset/problem/803/E

状态表示

d[i][j] ,第i局得分为j是否成立

转移方程

  1. 这一局为?,即可能赢,输,平局: d[i][j]=d[i1][j1]|d[i1][j+1]|d[i1][j]
  2. 已经确定该局的状态,直接按照条件转移即可:
    a) ai=W:d[i][j]=d[i1][j1]
    b) ai=L:d[i][j]=d[i1][j+1]
    c) ai=D:d[i][j]=d[i1][j]

细节

  1. 注意可能最后得分是-k,所以在dp的时候,对j加上偏移量。
  2. 注意边界,在 i<j 一定不满足,并且 j=k or j=k 时,i必须为 n
#include <bits/stdc++.h>
using namespace std;
const int M=1001;
char s[1010];
int f[1010][2010],g[1010][2010];
int n,k;
void dp(int i,int t)
{
    for(int j=-k+1+M;j<M+k;j++)
    {
        if(!f[i][j]&&f[i+1][j+t])
        {
            f[i][j]=1;
            g[i][j]=t;
        }
    }
}
int main()
{
	scanf("%d%d%s", &n, &k, s);
	f[n][M+k]=f[n][M-k]=1;
    for(int i=n-1;i>=0;i--)
    {
        if(s[i]=='W') dp(i,1);
        else if(s[i]=='L') dp(i,-1);
        else if(s[i]=='D') dp(i,0);
        else dp(i,0),dp(i,1),dp(i,-1);
    }
    if(f[0][M])
    {
        for(int i=0,j=M;i<n;i++)
        {
            s[i]=(g[i][j]+1)["LDW"];
            j+=g[i][j];
        }
        printf("%s\n",s);
    }
    else
    {
        printf("NO\n");
    }
	return 0;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值