2016"京胜杯"- YZK的大别墅

来源:互联网 发布:linux启动5938端口 编辑:程序博客网 时间:2024/04/27 19:53

2016”京胜杯”- YZK的大别墅

题目描述

       土豪YZK最近得到了面积为n*m的一大块土地(高兴ING^_^),他想在这块土地上建造一所房别墅,但是这个别墅必须是方形的。 可是,这块土地并非十全十美,上面有很多不平坦的地方(也可以叫瑕疵)。这些瑕疵十分恶心,以至于根本不能在上面盖一砖一瓦。但是却可以挖成人工观赏湖,或者挖成游泳池。 YZK希望找到一块最大的方形土地来盖别墅,既然是别墅,肯定要有些景观,但是YZK最多只愿意造k个人工湖或游泳池,现在请你来帮助YZK找到面积最大的满足条件的土地。 给定一个01矩阵,0表示土地可用,1表示土地不可用,输出符合YZK要求的最大土地的面积。

输入

       第一行一个整数T,表示有T组测试数据。 对于每组测试数据,第一行包含三个整数n,m,k,表示矩阵的行数和列数,以及最多的人工湖或游泳池数量。 之后n行,每行m个整数,表示矩阵。 T < 25 0 < n,m < 100

输出

       对于每组数据输出一行,包含一个整数,表示最大面积。

样例输入

2
2 2 0
1 0
0 1
3 3 1
1 0 0
0 0 1
0 0 1

样例输出

1
6

思路

-此题主要是采取动态规划求解,用数组dp记录信息,dp[i][j]代表第j列从第一行的第i行所包含1的个数。
-然后将二维形式转化为一维形式求解。

#include <iostream>#include <cstring>#include <fstream>#include <cstdio>using namespace std;int dp[105][105];int main() {    int t;    cin >> t;    while(t --) {        memset(dp, 0, sizeof(dp));        int n, m, k;        cin >> n >> m >> k;        for(int i = 1; i <= n; i ++) {            for(int j = 1; j <= m; j ++) {                int temp;                cin >> temp;                dp[i][j] = temp + dp[i-1][j];            }        }        int _max = 0;        for(int i = 1; i <= n; i ++){            for(int j = i; j <= n; j ++){                int temp = 0;                int start = 0;   //起始列的前一列                int span = 0;    //横向跨度                for(int l = 1; l <= m; l ++){                    //当为遍历的列数小于横向跨度时结束                    if(span > m - start){                        break;                    }                    //记录当前子矩阵中1的个数                    temp += dp[j][l] - dp[i-1][l];                    int a = (j - i + 1) * (l - start);                    //当前子矩阵的面积                    if(temp > k){                        //当前子矩阵中1的个数大于k时起始列右移一位                        temp -= (dp[j][start+1]-dp[i-1][start+1]);                        start ++;                    }                    else if(temp <= k && a > _max){                        span = l - start;//更新横向跨度                        _max = a;                    }                }            }        }        cout << _max << endl;    }    return 0;}
1 1
原创粉丝点击