hdu 1506(dp求最大子矩阵)

题意:容易理解...

分析:对于每个单位矩阵,我们先求出连续比它高的最左边的下标假设为l,然后求出比它高的最右边的下标假设为r,然后矩阵的面积就是(r-l+1)*1;我们从左到

右扫一遍,求出每个点的l保存在l[]数组里,然后从右到左扫一遍,求出每个点的r保存在r[]数组里,最后可以求出最大的矩阵了。

然后做完这个题可以做下这道题的加强版--hdu 1505 我的博客链接:http://www.cnblogs.com/jiangjing/p/3221442.html

代码实现:

#include<stdio.h>
#include<string.h>
__int64 a[],dp[],l[],r[];
int main()
{
__int64 n,i,t,max;
while(scanf("%I64d",&n)!=EOF&&n)
{
max=-;
for(i=;i<=n;i++)
scanf("%I64d",&a[i]);
l[]=;r[n]=n;
for(i=;i<=n;i++)//求每个点左边连续比它大的最左边的下标,保存在l[]数组里
{
t=i;
while(t>&&a[i]<=a[t-])
t=l[t-];
l[i]=t;
}
for(i=n-;i>=;i--)//求每个点右边连续比它大的最右边的下标,保存在r[]数组里
{
t=i;
while(t<n&&a[i]<=a[t+])
t=r[t+];
r[i]=t;
}
for(i=;i<=n;i++)
if((r[i]-l[i]+)*a[i]>max)
max=(r[i]-l[i]+)*a[i];
printf("%I64d\n",max);
}
return ;
}
上一篇:Java中的return语句使用总结


下一篇:java开发中使用枚举表述数据字典