4道dp类型相似。
给出一列柱状图的高度,在其中找出组成的最大矩形
最基础的一道,之后4题都是用的一样的思想。从每个点向两边扫,找到大于等于该点高度的最远端。
扫的时候加上l[],r[]数组用dp的思想记录每个点构造矩形的左右端点确保每个点只被左右各扫一次。
#define N 112345
int n,m;
int flag,sum,ave,ans;
long long res,t;
long long a[N],b[N],c[N];
int main()
{
int i,j,k,kk,x,y;
while(scanf("%d",&n)!=EOF&&n)
{
for(i=1;i<=n;i++)
scanf("%I64d",&a[i]);
b[1]=1;c[n]=n;
for(i=2;i<=n;i++)
{
t=i;
while(t>1&&a[i]<=a[t-1])
t=b[t-1];
b[i]=t;
}
for(i=n-1;i>=1;i--)
{
t=i;
while(t
给出一个矩阵只存在‘R’保留位置,与‘F’自由位置,在其中找出最大的矩形区域能够自由使用。
#define N 1123
int n,m;
int flag,sum,ave,ans,res;
int g[N][N],l[N][N],r[N][N];
char s[3];
int main()
{
int i,j,k,kk,t,x,y;
scanf("%d",&k);
while(k--)
{
scanf("%d%d",&n,&m);
for (i=1;i<=m;++i) g[0][i]=0;
for (i=1;i<=n;++i)
{
for (j=1;j<=m;++j)
{
scanf("%s",s);
if (s[0]=='F') g[i][j]=g[i-1][j]+1;
else g[i][j]=0;
}
g[i][0]=g[i][m+1]=-1;
}
for(i=1;i<=n;i++)
{
l[i][1]=1;r[i][m]=m;
for(j=2;j<=m;j++)
{
t=j;
while(t>1&&g[i][j]<=g[i][t-1])
t=l[i][t-1];
l[i][j]=t;
}
for(j=m-1;j>0;j--)
{
t=j;
while(t
给出一个二维矩阵,其中有a,b,c,w,x,y,z七种字符,
可以将w变为a或b,可以将x变为c或b,可以将y变为a或c,可以将z变为a或b或c。
求任意改变后可能得到的最大相同子矩阵大小
#define N 1123
int n,m;
int flag,sum,ave,ans,res;
int g[N][N],l[N][N],r[N][N];
char s[N][N];
void solve(char aa,char bb,char cc,char dd)
{
int i,j,t;
for (i=1;i<=m;++i) g[0][i]=0;
for (i=1;i<=n;++i)
{
for (j=1;j<=m;++j)
{
if (s[i][j]==aa||s[i][j]==bb||s[i][j]==cc||s[i][j]==dd) g[i][j]=g[i-1][j]+1;
else g[i][j]=0;
}
g[i][0]=g[i][m+1]=-1;
}
for(i=1;i<=n;i++)
{
l[i][1]=1;r[i][m]=m;
for(j=2;j<=m;j++)
{
t=j;
while(t>1&&g[i][j]<=g[i][t-1])
t=l[i][t-1];
l[i][j]=t;
}
for(j=m-1;j>0;j--)
{
t=j;
while(t
给出一个0/1矩阵,求其中最大全1子矩阵,任意列可交换。
#define N 1123
int n,m;
int flag,sum,ave,ans,res;
int a[N],b[N];
int g[N][N],l[N][N],r[N][N];
char s[N];
bool cmp(int a,int b)
{ return a>b; }
int main()
{
int i,j,k,kk,t,x,y;
while(scanf("%d%d",&n,&m)!=EOF&&n)
{
res=0;
for (i=1;i<=m;++i) g[0][i]=0;
for (i=1;i<=n;++i)
{
scanf("%s",s);
for (j=1;j<=m;++j)
{
if (s[j-1]=='1') g[i][j]=g[i-1][j]+1;
else g[i][j]=0;
a[j]=g[i][j];
}
g[i][0]=g[i][m+1]=-1;
a[0]=a[m+1]=-1;
sort(a+1,a+m+1,cmp);
for(j=1;j<=m;j++)
{
res=max(res,j*a[j]);
}
}
printf("%d\n",res);
}
return 0;
}