天天看點

HDU - 5110(遞推)

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;

const int maxn = 1001;
const int N = 5;
int rsum[maxn][maxn][N],d[maxn][maxn][N];
int a[maxn][maxn],SUM[maxn][maxn],n,m,Q;
int sum(int i,int x,int y,int d){
return rsum[i][y][d] - rsum[i][x-1][d];
}
int cal(int x,int y,int D){
int res = 0;
int step = 0;
for(;;){
if(x - step < 1) break;
int L = max(1,y-step);
int R = min(m,y+step);
res +=(SUM[x-step][R] - SUM[x-step][L-1]);
step+=D;
}
return res;
}
int main()
{
    memset(SUM,0,sizeof(SUM));
    while(scanf("%d %d %d",&n,&m,&Q)==3){
          for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++){
              int ch=getchar();
              while(ch!='.'&&ch!='X') ch=getchar();
              a[i][j] = (ch=='X' ? 1 : 0);
              SUM[i][j] = SUM[i][j-1] + a[i][j];
          }
            for(int i=1;i<=n;i++)
             for(int j=1;j<=m;j++)
                for(int k=1;k<N;k++){
                     int add = 0;
                     if(i - k > 0 && j + k <= m) add = rsum[i-k][j+k][k];
                     rsum[i][j][k] = add + a[i][j];
            }
            for(int i=1;i<=n;i++)
             for(int j=1;j<=m;j++)
                for(int k=1;k<N;k++){
                     rsum[i][j][k] = rsum[i][j][k] + rsum[i][j-1][k];
            }
          for(int i=1;i<=n;i++)
             for(int j=1;j<=m;j++)
                for(int k=1;k<N;k++){
                     if(i <= k || j <= k){
                            int& res =d[i][j][k];
                            res = cal(i,j,k);
                     }
                     else {
                        int L = max(1,j - k + 1);
                        int R = min(m,j + k);
                        d[i][j][k] = d[i-k][j-k][k] + sum(i-k,L,R,k) + a[i][j];
                     }
          }
          while(Q--){
             int x,y,D;
             scanf("%d %d %d",&x,&y,&D);
             if(D < N) printf("%d\n",d[x][y][D]);
             else {
                printf("%d\n",cal(x,y,D));
             }
          }
    }
    return 0;
}
           

繼續閱讀