您的位置:首页 > 其它

sgu273:Game Po(dp)

2015-06-20 12:43 323 查看
题目大意:

~~~~~~给定一个由b,r,y,wb,r,y,w构成的字符串和相应的映射列表。

~~~~~~这里的映射指的是若有映射(a,b)→c(a,b,c(a,b)\rightarrow c(a,b,c可相同且均是b,r,y,wb,r,y,w其中的一个)),那么字符串中的abab可以替换成cc((一种替换无次数限制)),问在经过多次替换后,可以留下的唯一一个字母有哪些。

分析:

~~~~~~fi,j,rf_{i,j,r}表示字符串中i∼ji\sim j这一段可以替换成字符rr,方程很显然就是:

~~~~~~~~~~~~~~~~~~~~~~fi,j,r=max{fi,k,p&fk+1,j,q(f_{i,j,r}=\max \{f_{i,k,p}&f_{k+1,j,q}(存在映射(p,q)→r(p,q)\rightarrow r)})\}

AC code:

[code]#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <algorithm>
#include <string>
#include <sstream>
#include <iostream>
#include <map>
#include <set>
#include <list>
#include <stack>
#include <queue>
#include <vector>
#define pb push_back
#define mp make_pair
typedef long long LL;
typedef double DB;
typedef long double LD;
using namespace std;

const int MAXN = 209;
const int MAXM = 19;
const int SIGMA = 4;

int s[SIGMA];
int Map[300];
char str[MAXN];
int n, seq[MAXN];
bool cap[SIGMA][SIGMA][SIGMA];
bool f[MAXN][MAXN][SIGMA];
char name[5] = "bryw";
bool ans[SIGMA];

int main()
{
    #ifndef ONLINE_JUDGE
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
    #endif

    Map['b'] = 0, Map['r'] = 1, Map['y'] = 2, Map['w'] = 3;
    for(int i = 0; i < 4; ++i) scanf("%d", s+i);
    scanf("\n");
    for(int i = 0; i < 4; ++i)
        for(int j = 0; j < s[i]; ++j)
        {
            char a = getchar(), b = getchar();
            scanf("\n");cap[Map[a]][Map[b]][i] = true;
        }
    scanf("%s", str), n = strlen(str);
    for(int i = 0; i < n; ++i)
    {
        seq[i+1] = Map[str[i]];
        f[i+1][i+1][seq[i+1]] = true;
    }
    bool flag = false;
    for(int l = 2; l <= n; ++l)
        for(int i = 1, j; i+l-1 <= n; ++i)
        {
            j = i+l-1;
            for(int k = i; k < j; ++k)
                for(int p = 0; p < 4; ++p)
                    if(f[i][k][p])
                        for(int q = 0; q < 4; ++q)
                            if(f[k+1][j][q])
                                for(int r = 0; r < 4; ++r)
                                    if(cap[p][q][r])
                                        f[i][j][r] = true;
        }
    for(int i = 0; i < 4; ++i)
        if(f[1]
[i])
            flag = ans[i] = true;
    if(!flag) puts("Nobody");
    else 
    {
        for(int i = 0; i < 4; ++i)
            if(ans[i]) putchar(name[i]);
        puts("");
    }

    #ifndef ONLINE_JUDGE
    fclose(stdin);
    fclose(stdout);
    #endif
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: