[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 }
原文地址:https://www.cnblogs.com/dcdcbigbig/p/9508051.html