题意也很容易理解: 求最大子矩阵 R代表不能被使用,F代码可以使用。
嗯,算是1506的变形吧!
先计算下每一列的矩阵长度,然后按照1506来搞就可以了!
当然,还需要其它简单的控制。。。。。参照上篇blog!(强烈推荐……)
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define NN 1010
#define Max(a,b) (a>b?a:b)
int map[NN][NN];
int l[NN],r[NN];
__int64 ans;
void dp(int cur,int n)
{
int i;
for(i=1;i<=n;i++){
l[i]=r[i]=i;
}
for(i=1;i<=n;i++){
while(map[cur][l[i]-1] >= map[cur][i])
l[i] = l[l[i]-1];
}
for(i=n;i>=1;i--){
while(map[cur][r[i]+1] >= map[cur][i])
r[i] = r[r[i]+1];
}
for(i=1;i<=n;i++){
ans = Max(ans,map[cur][i]*(r[i]-l[i]+1));
}
}
int main()
{
int t,n,m,i,j;
char s[2];
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)map[i][0]=-1;
map[n+1][0]=-2;
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
scanf("%s",s);
if(s[0] == 'R'){
map[i][j] = 0;
map[i][0] = -2;
}
else map[i][j] = map[i-1][j] + 1;
}
map[i][j]= -1;
}
ans = 0;
for(j=1;j<=n;j++){
if(map[j+1][0] == -2){
dp(j,m);
}
}
printf("%I64d\n",ans*3);
}
return 0;
}
本文介绍了一种优化的算法,用于解决最大子矩阵问题。通过计算每一列的矩阵长度并应用特定策略,该算法能有效识别无法使用的元素,并在给定约束下寻找最优解决方案。代码实例展示了实现细节,包括预处理矩阵、动态规划步骤和最终结果计算。
1937

被折叠的 条评论
为什么被折叠?



