zoukankan      html  css  js  c++  java
  • [agc004d]salvage robot

    题意:

    别问我谁翻译的

    虫合虫莫国的领土我们可以抽象为H*W的笼子,在这虫合土上,有若干个机器人和一个出口,其余都是空地,每次虫合虫莫会要求让所有的机器人向某个方向移动一步,当机器人移动到出口时会被虫合虫莫氵舌扌商出来,当机器人移出笼子时会自木木_火,求最多能取出多少个机器人

    $H,W<=100$

    题解:

    暴力DP;

    枚举子矩阵的左上角和右下角,$f[x][y][x_1][y_1]$表示走完$(x,y)~(x_1,y_1)$这个子矩形最多能扌商多少机器人,维护每行每列机器人数的前缀和,暴力转移即可,时间复杂度是$O(n^4)$,但是常数很小。

    代码:

     1 #include<iostream>
     2 #include<cstring>
     3 #include<cstdio>
     4 #include<cmath>
     5 using namespace std;
     6 short f[102][102][102][102];
     7 int h,w,vx,vy,ans=0,num[102][102],pre1[102][102],pre2[102][102];
     8 char s[101];
     9 int main(){
    10     scanf("%d%d",&h,&w);
    11     for(int i=1;i<=h;i++){
    12         scanf("%s",s+1);
    13         for(int j=1;j<=w;j++){
    14             if(s[j]=='o'){
    15                 pre1[i][j]=pre2[i][j]=num[i][j]=1;
    16             }else if(s[j]=='E'){
    17                 vx=i,vy=j;
    18             }
    19             pre1[i][j]+=pre1[i][j-1];
    20             pre2[i][j]+=pre2[i-1][j];
    21         }
    22     }
    23     for(int i=vx;i;i--){
    24         for(int j=vy;j;j--){
    25             for(int k=vx;k<=h;k++){
    26                 for(int l=vy;l<=w;l++){
    27                     if(i>1&&i+vx>k+1)f[i-1][j][k][l]=max((int)f[i-1][j][k][l],(int)(f[i][j][k][l]+pre1[i-1][min(l,w-vy+j)]-pre1[i-1][max(j-1,l-vy)]));
    28                     if(j>1&&j+vy>l+1)f[i][j-1][k][l]=max((int)f[i][j-1][k][l],(int)(f[i][j][k][l]+pre2[min(k,h-vx+i)][j-1]-pre2[max(i-1,k-vx)][j-1]));
    29                     if(k<h&&vx+k<h+i)f[i][j][k+1][l]=max((int)f[i][j][k+1][l],(int)(f[i][j][k][l]+pre1[k+1][min(l,w-vy+j)]-pre1[k+1][max(j-1,l-vy)]));
    30                     if(l<w&&vy+l<w+j)f[i][j][k][l+1]=max((int)f[i][j][k][l+1],(int)(f[i][j][k][l]+pre2[min(k,h-vx+i)][l+1]-pre2[max(i-1,k-vx)][l+1]));
    31                 }
    32             }
    33         }
    34     }
    35     for(int i=vx;i;i--){
    36         for(int j=vy;j;j--){
    37             for(int k=vx;k<=h;k++){
    38                 for(int l=vy;l<=w;l++){
    39                     ans=max(ans,(int)f[i][j][k][l]);
    40                 }
    41             }
    42         }
    43     }
    44     printf("%d",ans);
    45     return 0;
    46 }
  • 相关阅读:
    freeswitch录音功能
    jdk安装
    maven阿里云镜像
    idea安装
    idea新建maven项目
    tomcat安装
    idea新建maven web项目
    idea新建java项目
    webpack使用
    ACE 安装指南及示例
  • 原文地址:https://www.cnblogs.com/dcdcbigbig/p/9508051.html
Copyright © 2011-2022 走看看