AC日记——Roma and Poker codeforces 803e

803E - Roma and Poker

思路:

  赢或输或者平的序列;

  赢和平的差的绝对值不得超过k;

  结束时差的绝对值必须为k;

  当“?”时可以自己决定为什么状态;

  输出最终序列或者NO;

  dp(随便搞搞);

来,上代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

int n,k,dp[1005][2005],m;

char ch[1005];

int main()
{
    cin>>n>>k;
    cin>>ch+1;
    m=k-1;dp[0][m+1]=true;
    for(int i=1;i<n;i++)
    {
        if(ch[i]=='W') for(int j=2;j<=m*2+1;j++) dp[i][j]=dp[i-1][j-1];
        else if(ch[i]=='L') for(int j=1;j<m*2+1;j++) dp[i][j]=dp[i-1][j+1];
        else if(ch[i]=='D') for(int j=1;j<=m*2+1;j++) dp[i][j]=dp[i-1][j];
        else for(int j=1;j<=m*2+1;j++) dp[i][j]=(dp[i-1][j-1]||dp[i-1][j]||dp[i-1][j+1]);
    }
    if(ch[n]=='W') dp[n][2*m+2]=dp[n-1][2*m+1];
    else if(ch[n]=='L') dp[n][0]=dp[n-1][1];
    else if(ch[n]=='D') ;
    else dp[n][0]=dp[n-1][1],dp[n][m*2+2]=dp[n-1][m*2+1];
    if(!dp[n][0]&&!dp[n][m*2+2]) cout<<"NO";
    else
    {
        int now;
        if(dp[n][m*2+2]) now=m*2+2;
        else now=0;
        for(int i=n;i>0;i--)
        {
            if(ch[i]=='L') now++;
            else if(ch[i]=='W') now--;
            else if(ch[i]=='D') now=now;
            else
            {
                if(dp[i-1][now+1]) now++,ch[i]='L';
                else if(dp[i-1][now]) ch[i]='D';
                else if(dp[i-1][now-1]) now--,ch[i]='W';
            }
        }
        cout<<ch+1;
    }
    return 0;
}
原文地址:https://www.cnblogs.com/IUUUUUUUskyyy/p/6830549.html