hdu 1937 Finding Seats 尺取法

原创 2015年07月25日 22:58:10

这道题主要就是选一个对角矩阵,使得其内的可用座位》=k,求满足这个条件的最小矩阵面积

三重循环加优化,最内层为尺取法,复杂度大概为300;

故空间复杂度为300^3,不会超时,同时第三层内的搜索与判断都应为加法级别的;

第一次打的时候判断一个区域内的可用座位是暴力搜索,最麻烦的时候复杂度达到300^5,。。超时

看了其他人的代码才明白;

先进行一个对矩阵内可用座位的预处理,复杂度为300^2;

故代码的复杂度可理解为300^3+300^2,比我都300^3*300^2快的不是一个级别

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int INF=1<<31-1;
char a[310][310];
int mmap[310][310];
int r,c,k;
void chuli()
{
    int i,j;
    for(i=1;i<=r;i++)
        mmap[i][1]=(a[i][1]=='.');
    for(j=1;j<=c;j++)
        mmap[1][j]=(a[1][j]=='.');
    for(i=1;i<=r;i++)
    {
        for(j=1;j<=c;j++)
        {
            mmap[i][j]=(mmap[i-1][j]+mmap[i][j-1]-mmap[i-1][j-1]+(a[i][j]=='.'));
        }
    }
}
int check(int x1,int y1,int x2,int y2)
{
    if(mmap[x2][y2]+mmap[x1-1][y1-1]-mmap[x1-1][y2]-mmap[x2][y1-1]>=k)
        return 0;
    else
        return 1;
}
int main()
{
    while(scanf("%d%d%d",&r,&c,&k)!=EOF)
    {
        memset(mmap,0,sizeof(mmap));
        if(r==c&&r==k&&k==0)
        {
            break;
        }
        int i,j;
        for(i=1;i<=r;i++)
             scanf("%s",a[i]+1);
        chuli();
        int t1,t2;
        int min=INF;

        for(i=1;i<=r;i++)
        {
            for(j=i;j<=r;j++)
            {
                for(t1=1,t2=1;t1<=c;t1++)
                {
                    while(check(i,t1,j,t2)==1&&t2<c)
                       {
                           t2++;
                       }
                    if(check(i,t1,j,t2)==0)
                    {
                        if(min>(j-i+1)*(t2-t1+1))
                        min=(j-i+1)*(t2-t1+1);
                    }
                }
            }
        }
        printf("%d\n",min);
    }
    return 0;
}



版权声明:本文为博主原创文章,未经博主允许不得转载。

hdu 1937(尺取法)

题意:给定一个R*C的矩阵,选择一个面积最小的子矩阵,使得其内部‘.’的个数>=k。 解题思路:这道题如果时普通的枚举,会要达到O(N^5)严重超时。这里可以采用高效的枚举方法——尺取法。 ...
  • hexianhao
  • hexianhao
  • 2016年05月04日 17:06
  • 318

hdu 1937 Finding Seats 尺取法

这道题主要就是选一个对角矩阵,使得其内的可用座位》=k,求满足这个条件的最小矩阵面积 三重循环加优化,最内层为尺取法,复杂度大概为300; 故空间复杂度为300^3,不会超时,同时第三层内的搜...
  • sholck222
  • sholck222
  • 2015年07月25日 22:58
  • 547

HDU1937How many ways(记忆化搜索)入门

ACM的路走了就不要停
  • xky140610205
  • xky140610205
  • 2016年07月15日 20:14
  • 460

hdu 1937 Finding Seats

#include #include #include #include using namespace std; int map[310][310], sum[310][310]; int...
  • qq_35567127
  • qq_35567127
  • 2016年08月02日 11:11
  • 101

hdu 1937 Finding Seats

其实就是求一个01矩阵中矩阵和为k的矩阵的最小面积。通过将行之间求和,可以通过计算一维数组中的和为k的最短区间来求出当前合并的矩阵中的最小答案。 #include #include #inc...
  • u012345506
  • u012345506
  • 2015年09月22日 16:39
  • 158

hdu1231 连续子数组最大和(分治,动态规划)

1)开心,学习伪码之后,自己敲完的代码;发现《导论》在纯粹的算法知识方面比紫书讲的更细致,更好懂一些。 分治策略,旨在将原先的大问题不断分解成规模小的问题,比如最大连续子数组,以中间界线分三部分,左边...
  • a272846945
  • a272846945
  • 2016年03月07日 21:52
  • 1018

hdu5806尺取法

将不小于m的数看作1,剩下的数看作0,那么只要区间内1的个数不小于k则可行,枚举左端点,右端点可以通过two-pointer求出。时间复杂度O(n)O(n)。#include #include #...
  • aonaigayiximasi
  • aonaigayiximasi
  • 2016年08月09日 20:35
  • 271

HDU - 1937 - Finding Seats【思维尺取】

Finding SeatsTime Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) To...
  • nobleman__
  • nobleman__
  • 2017年10月14日 21:17
  • 101

关于 sicily1556 Finding Seats

题目描述:给定一个矩形座位表的行数和列数,在一个矩形座位表中找到一个含有给定个空位的矩形 ,使它面积最小例如3 5 5...XX.X.XXXX...  答案是6解法:首先用int seatnum[30...
  • bingshangjiguang
  • bingshangjiguang
  • 2010年06月15日 21:19
  • 247

HDU_完全背包系列

HDU 完全背包系列持续更新中……
  • jhgkjhg_ugtdk77
  • jhgkjhg_ugtdk77
  • 2016年07月23日 12:01
  • 1418
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hdu 1937 Finding Seats 尺取法
举报原因:
原因补充:

(最多只允许输入30个字)