zoukankan      html  css  js  c++  java
  • 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;
    }


  • 相关阅读:
    [转]OOA/OOD/OOP区别
    Get / Post
    1.PHP环境搭配
    6.WCF Rest
    消除关闭按钮时的IE弹出提示
    TSQL DML学习笔记
    javascript 中类的定义
    $().each() 与 $.each()区别,以及 jquery ajax 应用
    TSQL 数据库的创建
    删除用户表 存储过程 索引..
  • 原文地址:https://www.cnblogs.com/herumw/p/9464589.html
Copyright © 2011-2022 走看看