您的位置:首页 > 其它

UVA 10074 Take the Land(最大子矩阵和变形)

2013-03-21 11:41 387 查看
题目大意:输入矩阵,找出元素全为0的子矩阵的元素最大和。

解题策略:将0,1转换,动态规划中判断最长子区间和与当前列的大小的关系。

/*
UVA 10074 Take the Land
AC by J.Dark
ON 2013/3/21
Time 0.020s
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 110;
int matrix[maxn][maxn];
int width, height;

inline void input(){
for(int i=0; i<width; i++){
for(int j=0; j<height; j++){
cin >> matrix[i][j];
// 0,1互换
matrix[i][j] = 1-matrix[i][j];
}
}
}

int max_sum(int *b, int *matrix, int len_colu){
int C_sum = 0;   //当前列最大子区间和
int temp = 0;
for(int i=0; i<height; i++) b[i] += matrix[i]; //当前第i-j行,长度为1~j-i+1的“条”的长度
//依次枚举i-j行间,长度从1~j-i+1的“条”
for(int i=0; i<height; i++){
if(b[i] < len_colu){   //出现“1”不连续情况则抛弃
temp = 0;
continue;
}
temp += b[i];
if(temp > C_sum) C_sum = temp;
}
return C_sum;
}

void solve(){
int maxSum = 0, b[maxn];
int temp = 0;
for(int i=0; i<width; i++){
memset(b, 0, sizeof(b));
for(int j=i; j<width; j++){
//枚举第i行~第j行的 满足题意的子矩阵元素数,取最大
temp = max_sum(b, matrix[j], j-i+1);
maxSum = max(maxSum, temp);
}
}
cout << maxSum << endl;
}
///////////////////////////////////////////////////////////////
int main(){
while(cin >> width >> height && (width || height))
{
input();
solve();
}

//system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: