您的位置:首页 > 其它

#HDU 1505 dp 最大子矩阵

2017-07-24 16:22 267 查看
City Game

题意:在一个由”R”、”F”组成的大矩阵中求出一个最大的全是”F”的最大子矩阵。

分析:对于这个题目,我们可以参照HDU 1506,类型相同,只需转换一下就可以做。对于每一行,我们求出每一个元素向上可以达到的最大高度( 即 HDU 1506 中的柱形的高度),这样就转化成m组柱形,对每一组都去求出最大的子矩阵即可。

TIPS:答案是“m组中最大的矩阵 * 3”;

代码如下

#include <algorithm>
#include <bitset>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;

#define MAXN 1005
int a[MAXN][MAXN],L[MAXN][MAXN],R[MAXN][MAXN];

int main(){
int ans,temp,T,m,n;
scanf("%d",&T);
while(T--){
memset(a,0,sizeof(a));
memset(L,0,sizeof(L));
memset(R,0,sizeof(R));
scanf("%d%d",&m,&n);
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
char s[5];
scanf("%s",s);
if(s[0]=='F')
a[i][j]=a[i-1][j]+1;//当前向上的最大连续高度
else
a[i][j]=0;
}
}
/* for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
cout<<a[i][j]<<" ";
}
cout<<endl;
}*/

ans=0;
for(int i=1;i<=m;i++){
L[i][1]=1;
for(int j=2;j<=n;j++){
int k=j;
while(k>1&&a[i][j]<=a[i][k-1])k=L[i][k-1];
L[i][j]=k;
}

R[i]
=n;
for(int j=n-1;j>=1;j--){
int k=j;
while(k<n&&a[i][j]<=a[i][k+1])k=R[i][k+1];
R[i][j]=k;
}

temp=0;
for(int j=1;j<=n;j++){
if( temp < a[i][j]*(R[i][j]-L[i][j]+1) ){
temp = a[i][j]*(R[i][j]-L[i][j]+1);
}
}
if(ans<temp)ans=temp;
}
printf("%d\n",ans*3);
}
return 0;
}


JNU-ACM-ICPC

WYC
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  dp