zoukankan      html  css  js  c++  java
  • [agc004e]Salvage Robots dp

    Description

    蛤蟆国的领土我们可以抽象为H*W的笼子,在这片蛤土上,有若干个机器人和一个出口,其余都是空地,每次蛤蟆会要求让所有的机器人向某个方向移动一步,当机器人移动到出口时会被蛤蟆活摘出来,当机器人移出笼子时会自焚,求你最多取出的多少个机器人。

    Input

    第一行两个整数H,W,如题目所述
    接下来H行,每行W个字符,包含三类字符:
    第一类是'.'表示空地
    第二类是'o'表示有一个机器人
    第三类是'E'表示有一个出口,出口有且仅有一个

    Output

    一行,活摘的机器人个数

    Sample Input

    3 3
    o.o
    .Eo
    ooo
    

    Sample Output

    3
    

    HINT

    H,W≤100

    补充样例:

    3 4
    o...
    o...
    oooE
    输出:5
    
    5 11
    ooo.ooo.ooo
    o.o.o...o..
    ooo.oE..o..
    o.o.o.o.o..
    o.o.ooo.ooo
    输出:12
    

    Sol

    首先转化成矩形和格子走。

    我们设(f[i][j][k][l])表示起点向左最远走过i步,向右最远走过j步,向上最远走过k步,向下最远走过l步能够最大覆盖的机器人数量。

    那么我们转移的时候去掉已经出格的,加上转移的时候新增的量即可(一定是一个连续的序列,所以可以用前缀和预处理)。

    注意细节边界问题非常多。

    开short,否则爆空间。

    Code

    #include<bits/stdc++.h>
    using namespace std;
    short f[102][102][102][102],s1[102][102],s2[102][102],ans;int n,m,x,y;char c[102][102];
    int main()
    {    
        scanf("%d%d",&n,&m);for(int i=1;i<=n;i++) scanf("%s",c[i]+1);
        for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if(c[i][j]=='E') x=i,y=j;
        for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) s1[i][j]=s1[i][j-1]+(c[i][j]=='o'),s2[i][j]=s2[i-1][j]+(c[i][j]=='o');
        for(int a=0;a<x;a++) for(int b=0;b<=n-x;b++) for(int c=0;c<y;c++) for(int d=0;d<=m-y;d++)
        {   
            int U=b+1,D=n-a,L=d+1,R=m-c;ans=max(ans,f[a][b][c][d]);
            if(U<x-a) f[a+1][b][c][d]=max((int)f[a+1][b][c][d],f[a][b][c][d]+s1[x-a-1][min(R,y+d)]-s1[x-a-1][max(L,y-c)-1]);
            if(x+b<D) f[a][b+1][c][d]=max((int)f[a][b+1][c][d],f[a][b][c][d]+s1[x+b+1][min(R,y+d)]-s1[x+b+1][max(L,y-c)-1]);
            if(L<y-c) f[a][b][c+1][d]=max((int)f[a][b][c+1][d],f[a][b][c][d]+s2[min(D,x+b)][y-c-1]-s2[max(U,x-a)-1][y-c-1]);
            if(y+d<R) f[a][b][c][d+1]=max((int)f[a][b][c][d+1],f[a][b][c][d]+s2[min(D,x+b)][y+d+1]-s2[max(U,x-a)-1][y+d+1]);
        }
        printf("%d
    ",ans);
    }
    
    
  • 相关阅读:
    计算机系统概述
    Qt学习--初学注意事项
    Qt实现一个简单的TextEditor
    Qt 用户登录界面
    C++ 模板
    多态与虚函数
    继承与派生
    C++ 运算符重载
    web安全-点击劫持
    web安全问题-cookie
  • 原文地址:https://www.cnblogs.com/CK6100LGEV2/p/9508068.html
Copyright © 2011-2022 走看看