1505是1506的加强, 2870是1505的加强!
1506如下:
Largest Rectangle http://acm.hdu.edu.cn/showproblem.php?pid=1506
对于每一块木板,Area=height[i]*(j-k+1) 其中,j<=x<=k,height[x]>=height[i];找j,k成为关键,一般方法肯定超时,利用动态规划,如果它左边高度大于等于它本身,那么它左边的左边界一定满足这个性质,再从这个边界的左边迭代下去
for(i=1;i<=n;i++)
{
while(a[l[i]-1]>=a[i])
l[i]=l[l[i]-1];
}
for(i=n;i>=1;i--)
{
while(a[r[i]+1]>=a[i])
r[i]=r[r[i]+1];
故代码如下:
#include
#include
#include
#define M 100000
using namespace std;
__int64 a[M+5];
int l[M+5],r[M+5];
int main()
{
int n;
while(~scanf("%d",&n) && n)
{
for(int i=1;i<=n;i++)
scanf("%I64d",&a[i]);
a[0]=a[n+1]=-1;
for(int i=1;i<=n;i++)
{
l[i]=i;
while(a[l[i]-1]>=a[i])
l[i]=l[l[i]-1];
}
for(int i=n;i>=1;i--)
{
r[i]=i;
while(a[r[i]+1]>=a[i])
r[i]=r[r[i]+1];
}
__int64 tmp,ans=0;
for(int i=1;i<=n;i++)
{
tmp=(r[i]-l[i]+1)*a[i];
if(tmp>ans) ans=tmp;
}
printf("%I64d\n",ans);
}
return 0;
}
代码:
#include
#include
#include
#define M 1000
using namespace std;
int up[M+5][M+5];
int l[M+5][M+5],r[M+5][M+5];
int main()
{
int T,n,m;
char s[10];
scanf("%d",&T);
while(T--)
{
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]=='F') up[i][j]=up[i-1][j]+1;
else up[i][j]=0; // 高度
}
for(int i=1;i<=m;i++)
{
up[i][0]=up[i][n+1]=-1;
for(int j=1;j<=n;j++)
{
l[i][j]=j;
while(up[i][l[i][j]-1]>=up[i][j])
l[i][j]=l[i][l[i][j]-1];
}
for(int j=n;j>=1;j--)
{
r[i][j]=j;
while(up[i][r[i][j]+1]>=up[i][j])
r[i][j]=r[i][r[i][j]+1];
}
}
int ans=0,tmp;
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
{
tmp=up[i][j]*(r[i][j]-l[i][j]+1);
if(tmp>ans) ans=tmp;
}
printf("%d\n",ans*3);
}
return 0;
}
这道题的大体意思是求最大矩形面积(由相同字母组成的最大矩形);
代码:
#include
#include
#include
#define M 1000
using namespace std;
int a[M+5][M+5],b[M+5][M+5];
int up[M+5][M+5];
int l[M+5][M+5],r[M+5][M+5];
int ans;
void fun(int m,int n)
{
for(int i=1;i<=m;i++)
{
up[i][0]=up[i][n+1]=-1;
for(int j=1;j<=n;j++)
{
l[i][j]=j;
while(up[i][l[i][j]-1]>=up[i][j])
l[i][j]=l[i][l[i][j]-1];
}
for(int j=n;j>=1;j--)
{
r[i][j]=j;
while(up[i][r[i][j]+1]>=up[i][j])
r[i][j]=r[i][r[i][j]+1];
}
}
int tmp;
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
{
tmp=up[i][j]*(r[i][j]-l[i][j]+1);
if(tmp>ans) ans=tmp;
}
}
int main()
{
int T,n,m;
char s[M+5][M+5];
while(~scanf("%d%d",&m,&n))
{
ans=0;
for(int i=1;i<=m;i++)
scanf("%s",s[i]);
// 'a'
for(int i=1;i<=m;i++)
for(int j=0;j