• hdu 01 Matrix


    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 605    Accepted Submission(s): 127


    Problem Description
    It's really a simple problem. 
    Given a "01" matrix with size by n*n (the matrix size is n*n and only contain "0" or "1" in each grid), please count the number of "1" matrix with size by k*k (the matrix size is k*k and only contain "1" in each grid).
     

    Input
    There is an integer T (0 < T <=50) in the first line, indicating the case number.
    Each test case begins with two numbers n and m (0<n, m<=1000), specifying the size of matrix and the query number.
    Then n lines follow and each line contains n chars ("0" or "1").
    Then m lines follow, each lines contains a number k (0<k<=n).
     

    Output
    For each query, output the number of "1" matrix with size by k*k.
     

    Sample Input
    2 2 2 01 00 1 2 3 3 010 111 111 1 2 2
     

    Sample Output
    1 0 7 2 2
     


    这题用二维树状数组T了,改成用dp做,371ms过了。我们枚举每一个点作为右下角的点对各部分的贡献,那么就可以dp了。

    #include<iostream>
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<math.h>
    #include<vector>
    #include<map>
    #include<set>
    #include<queue>
    #include<stack>
    #include<string>
    #include<algorithm>
    using namespace std;
    typedef long long ll;
    #define pi acos(-1.0)
    #define maxn 1006
    int n;
    char s[maxn][maxn];
    int b[maxn],dp[maxn][maxn],heng[maxn][maxn],shu[maxn][maxn];
    int lowbit(int x){
        return x&(-x);
    }
    void update(int pos,int num)
    {
        while(pos<=maxn){
            b[pos]+=num;pos+=lowbit(pos);
        }
    }
    int getsum(int pos)
    {
        int num=0;
        while(pos>0){
            num+=b[pos];pos-=lowbit(pos);
        }
        return num;
    }
    
    
    int main()
    {
        int m,i,j,T,d;
        int l,r,mid;
        scanf("%d",&T);
        while(T--)
        {
            scanf("%d%d",&n,&m);
            for(i=1;i<=n;i++){
                scanf("%s",s[i]+1);
            }
            for(i=1;i<=n;i++){
                b[i]=0;
                for(j=1;j<=n;j++){
                    shu[i][j]=0;
                    heng[i][j]=0;
                }
            }
            /*
            memset(b,0,sizeof(b));
            memset(shu,0,sizeof(shu));
            memset(heng,0,sizeof(heng));
            memset(dp,0,sizeof(dp));
            */
            for(i=1;i<=n;i++){
                for(j=1;j<=n;j++){
                    if(i==1 && j==1){
                        if(s[i][j]=='1'){
                            dp[i][j]=shu[i][j]=heng[i][j]=1;
                            update(1,1);
                            update(2,-1);
                        }
                        else{
                            dp[i][j]=shu[i][j]=heng[i][j]=0;
                        }
                        continue;
                    }
                    if(s[i][j]=='0'){
                        dp[i][j]=shu[i][j]=heng[i][j]=0;
                        continue;
                    }
                    if(i==1){
                        dp[i][j]=1;
                        heng[i][j]=heng[i][j-1]+1;
                        shu[i][j]=1;
                        update(1,1);
                        update(dp[i][j]+1,-1);
    
                    }
                    else if(j==1){
                        dp[i][j]=1;
                        heng[i][j]=1;
                        shu[i][j]=shu[i-1][j]+1;
                        update(1,1);
                        update(dp[i][j]+1,-1);
                    }
                    else{
                        heng[i][j]=heng[i][j-1]+1;
                        shu[i][j]=shu[i-1][j]+1;
                        int len=min(heng[i][j],shu[i][j]);
                        len=min(len,dp[i-1][j-1]+1);
                        dp[i][j]=len;
                        update(1,1);
                        update(len+1,-1);
                    }
                }
            }
            for(i=1;i<=m;i++){
                scanf("%d",&d);
                printf("%d
    ",getsum(d));
            }
        }
        return 0;
    }


  • 相关阅读:
    POJ2516 构图+k次费用流
    POJ 1511 最短路径之和(spfa或dijkstra+heap)
    windows中配置mongodb
    原型设计
    Erlang的参考资源
    用Erlang实现递归查找文件
    list相关的习题
    springmvc基础知识
    汇编实验4
    实验3 转移指令跳转原理及其简单应用编程
  • 原文地址:https://www.cnblogs.com/herumw/p/9464589.html
Copyright © 2020-2023  润新知