• codeforces 596E Wilbur and Strings


    题意:一个矩阵上面有0~9的数字,可以从任意一个格子出发,每次根据格子上的数字会前进到另一个格子(或原地不动),现在给出q个数位串,问是否有走法可以取出这个串(走到格子上的时候可以不取)。

    思路:发现每个点的出度至多为1,那么可以预处理出走到这个格子后取某个数字最近的格子是哪个(f[i][j][0-9]),然后用队列存下开头,在做一遍贪心就可以了

    #include<cstdio>
    #include<cmath>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    int cnt,sz=0,f[201*201][10],c[201][201],id[201][201],vis[201][201],n,m,a[10],b[10],ans[201*201],d[201*201];
    int read(){
        char ch=getchar();int f=1,t=0;
        while (ch<'0'||ch>'9') {if (ch=='-') f=-1;ch=getchar();}
        while ('0'<=ch&&ch<='9'){t=t*10+ch-'0';ch=getchar();}
        return t*f;
    }
    void dfs(int x,int y){
        int dx=x+a[c[x][y]],dy=y+b[c[x][y]];
        if (dx<1||dx>n||dy<1||dy>m) f[id[x][y]][c[x][y]]=id[x][y];
        else{
            f[id[x][y]][c[x][y]]=id[dx][dy];
            if (!vis[dx][dy]) {vis[dx][dy]=1;dfs(dx,dy);}
            for (int i=0;i<=9;i++)
                if (i!=c[x][y])
                    f[id[x][y]][i]=f[id[dx][dy]][i];
        }
    }
    int main(){
        n=read();m=read();int T=read();cnt=0;
        for (int i=1;i<=n;i++){
            char s[2005];
            scanf("%s",s+1);
            for (int j=1;j<=m;j++){
                c[i][j]=s[j]-'0';id[i][j]=++cnt;d[cnt]=c[i][j];
         } }
       char s[1000005];
    for (int i=0;i<=9;i++) a[i]=read(),b[i]=read(); for (int i=1;i<=n;i++) for (int j=1;j<=m;j++) if (!vis[i][j]){ vis[i][j]=1; ans[++sz]=id[i][j]; dfs(i,j); }while (T--){ scanf("%s",s+1);bool flag=false; for (int i=1;i<=sz;i++){ int x=ans[i]; for (int j=1;j<=strlen(s+1);j++){ x=f[x][s[j]-'0'];if (x<=0) break; } if (x>0) {flag=true;break;} } if (flag) printf("YES ");else printf("NO "); } }
  • 相关阅读:
    URAL——DFS找规律——Nudnik Photographer
    URAL1353——DP——Milliard Vasya's Function
    URAL1203——DPor贪心——Scientific Conference
    递推DP HDOJ 5389 Zero Escape
    区间DP UVA 1351 String Compression
    树形DP UVA 1292 Strategic game
    Manacher HDOJ 5371 Hotaru's problem
    同余模定理 HDOJ 5373 The shortest problem
    递推DP HDOJ 5375 Gray code
    最大子序列和 HDOJ 1003 Max Sum
  • 原文地址:https://www.cnblogs.com/qzqzgfy/p/5682558.html
Copyright © 2020-2023  润新知