DP激情奉献(四)hdu1505加强版1506
来源:互联网 发布:阿里云免费主机申请 编辑:程序博客网 时间:2024/06/07 10:25
//本题是hdu1506的强化版本.题目大意是这样的:有一片土地.标记F为"空地",标记R为"已建造"
//现在要在这个m*n的空间里面找到一个最大矩形...
//处理方式:把每一行作为底行来可以形成一个状图,这样预处理以后就可以类似hdu1506那样的做..
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<math.h>
#include<string.h>
#include<vector>
#include<algorithm>
using namespace std;
int m,n,dp[2222][2222],r[2222],l[2222];
bool map[2222][2222];
char s[2111];
int main()
{
int test;
while( scanf("%d",&test) != EOF)
{
while(test--)
{
scanf("%d%d",&m,&n);
for(int i = 1 ; i <= m ; i++)
{
for(int j = 1 ; j <= n ; j++)
{
scanf("%s",s);
if(s[0] == 'R')
map[i][j] = 0;
else if(s[0] == 'F')
map[i][j] = 1;
}
}
memset(dp,-1,sizeof(dp));
for(int i = 1 ; i <= n ; i++)
dp[1][i] = map[1][i];
for(int i = 2 ; i <= m ; i++)
{
for(int j = 1 ; j <= n ; j++)
{
if(map[i][j])dp[i][j] = dp[i-1][j] + map[i][j];
else dp[i][j] = 0;
}
}
int ans = 0;
for(int i = 1 ; i <= m ; i++)
{
for(int j = 1 ; j <= n ; j++)
{
r[j] = j;
l[j] = j;
}
for(int j = 1 ; j <= n ; j++)
{
while(dp[i][l[j]-1] >= dp[i][j])
l[j] = l[l[j]-1];
}
for(int j = n ; j >= 1 ; j--)
{
while(dp[i][r[j]+1] >= dp[i][j])
r[j] = r[r[j]+1];
}
// printf("%d\n",i);
for(int j = 1 ; j <= n ; j++)
{
int x = (r[j] - l[j] + 1)*dp[i][j];
ans = max(ans,x);
// printf("%d %d %d %d %d\n",j,r[j],l[j],dp[i][j],x);
}
}
if(ans < 0)while(1);
printf("%d\n",3*ans);
}
}
}
//现在要在这个m*n的空间里面找到一个最大矩形...
//处理方式:把每一行作为底行来可以形成一个状图,这样预处理以后就可以类似hdu1506那样的做..
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<math.h>
#include<string.h>
#include<vector>
#include<algorithm>
using namespace std;
int m,n,dp[2222][2222],r[2222],l[2222];
bool map[2222][2222];
char s[2111];
int main()
{
int test;
while( scanf("%d",&test) != EOF)
{
while(test--)
{
scanf("%d%d",&m,&n);
for(int i = 1 ; i <= m ; i++)
{
for(int j = 1 ; j <= n ; j++)
{
scanf("%s",s);
if(s[0] == 'R')
map[i][j] = 0;
else if(s[0] == 'F')
map[i][j] = 1;
}
}
memset(dp,-1,sizeof(dp));
for(int i = 1 ; i <= n ; i++)
dp[1][i] = map[1][i];
for(int i = 2 ; i <= m ; i++)
{
for(int j = 1 ; j <= n ; j++)
{
if(map[i][j])dp[i][j] = dp[i-1][j] + map[i][j];
else dp[i][j] = 0;
}
}
int ans = 0;
for(int i = 1 ; i <= m ; i++)
{
for(int j = 1 ; j <= n ; j++)
{
r[j] = j;
l[j] = j;
}
for(int j = 1 ; j <= n ; j++)
{
while(dp[i][l[j]-1] >= dp[i][j])
l[j] = l[l[j]-1];
}
for(int j = n ; j >= 1 ; j--)
{
while(dp[i][r[j]+1] >= dp[i][j])
r[j] = r[r[j]+1];
}
// printf("%d\n",i);
for(int j = 1 ; j <= n ; j++)
{
int x = (r[j] - l[j] + 1)*dp[i][j];
ans = max(ans,x);
// printf("%d %d %d %d %d\n",j,r[j],l[j],dp[i][j],x);
}
}
if(ans < 0)while(1);
printf("%d\n",3*ans);
}
}
}
- DP激情奉献(四)hdu1505加强版1506
- HDU1505 City Game (DP,HDU1506加强版)
- HDU1505-----DP?HDU1506的加强版
- HDU1505--City Game(动态规划)(1506加强版)
- hdu1505—City Game(1506的加强版)
- HDU1505(HDU1506的加强版)
- DP激情奉献(一)hdu2955
- DP激情奉献(二)hdu1864
- DP激情奉献(五)hdu2571命运
- HDU 1506 && HDU1505 && HDU 2870 (DP).
- hdu 2870 Largest Submatrix (hdu1505加强版)
- hdu1505 City Game(DP)
- DP激情奉献(三)hdu1506状图选最大矩形
- HDU1505 1506升级版
- hdu 2830 Matrix Swapping II(hdu1505的加强版)
- 加强保持IT员工激情的四种方法
- 【DP】 hdu1505 City Game
- hdu1505 City Game(DP or 扫描线?)
- silverlight 中 StyleSelector
- linux LVS (keepalived+ipvsadm)负载均衡搭建
- lwIP RAW TCP/IP接口 .
- python对XML 操作
- page top功能以及根据屏幕宽度改变css
- DP激情奉献(四)hdu1505加强版1506
- android framelayout 应用
- UIView的学习
- JS刷新frame框架
- Access模糊查询
- U的含义,是什么的单位?
- Windows下的Memcache安装
- 如何从普通程序员晋升为架构师
- linux tee命令