暑期dp46道(9)——HDU 1505City Game 求最大子矩阵面积
2016-08-02 20:25
489 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1505
可参考本人dp46道(8)的部分思路
这题是1506的变形,但是我个人觉得这个是比1505简单的,因为觉得思路更为清晰:
(一)读入数据并记录h[i][j](这里用一个字符串s读入,对s[0]判断处理h[i][j]);
(二)扫描枚举,求(i,j)的l[i][j]和r[i][j];
(三)(r[i][j]-l[i][j]-1)*h[i][j]枚举求最大值;
和1506题的差别就是这个行没有固定,但是理解起来反而更容易,对比1506还是先做这个更好,后面还有个变形....
附上代码:
可参考本人dp46道(8)的部分思路
这题是1506的变形,但是我个人觉得这个是比1505简单的,因为觉得思路更为清晰:
(一)读入数据并记录h[i][j](这里用一个字符串s读入,对s[0]判断处理h[i][j]);
(二)扫描枚举,求(i,j)的l[i][j]和r[i][j];
(三)(r[i][j]-l[i][j]-1)*h[i][j]枚举求最大值;
for(int i=1;i<=n;i++) { h[i][0]=h[i][m+1]=-1; for(int j=1;j<=m;j++) { temp=j-1; while(h[i][temp]>=h[i][j]) temp=l[i][temp]; l[i][j]=temp; } for(int j=m;j>=1;j--) { temp=j+1; while(h[i][temp]>=h[i][j]) temp=r[i][temp]; r[i][j]=temp; } for(int j=1;j<=m;j++) { ans=Max(ans,(r[i][j]-l[i][j]-1)*h[i][j]); } }
和1506题的差别就是这个行没有固定,但是理解起来反而更容易,对比1506还是先做这个更好,后面还有个变形....
附上代码:
#include<cstdio> #include<cstring> #include<string> #define debug 0 #define M(a) memset(a,0,sizeof(a)) #define Max(a,b) ((a>b)?a:b) const int maxn=1000+5; int h[maxn][maxn],l[maxn][maxn],r[maxn][maxn]; int n,m,caseNum,ans; void Do() { int temp; for(int i=1;i<=n;i++) { h[i][0]=h[i][m+1]=-1;//很重要,两边赋-1,方便求值 for(int j=1;j<=m;j++)//扫描枚举求l[i][j]和r[i][j] { temp=j-1; while(h[i][temp]>=h[i][j]) temp=l[i][temp]; l[i][j]=temp; } for(int j=m;j>=1;j--) { temp=j+1; while(h[i][temp]>=h[i][j]) temp=r[i][temp]; r[i][j]=temp; } for(int j=1;j<=m;j++) { ans=Max(ans,(r[i][j]-l[i][j]-1)*h[i][j]);//枚举求最大子矩阵面积 } } printf("%d\n",3*ans); } int main() { #if debug freopen("in.txt","r",stdin); #endif//debug char a[10]; while(~scanf("%d",&caseNum)) { while(caseNum--) { ans=0; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) h[0][i]=0;//这个后来发现还是直接memset();初始化更省事些后面的题目用这个比较多 /* 例如: #define M(a) memset(a,0,sizeof(a)) M(h); */ for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) { scanf("%s",a);//字符串读入也可用: /*char a; while((a=getchar())==' '||a=='\n'); if(a=='R') { ... } else { ... } */ if(a[0]=='R') h[i][j]=0; else h[i][j]=h[i-1][j]+1; } Do(); } } return 0; }
相关文章推荐
- HDU 1506 Largest Rectangle in a Histogram【矩阵最大面积】
- hdu 1506 最大矩阵面积 __int64 AC long long TLE
- HDU 1505 City Game【矩阵的最大面积】
- HDU 2870 (最大0 1 矩阵面积)
- HDU 1505 1506 2830 2870求最大矩阵面积 DP
- 暑期dp46道(39)--HDOJ 2870 最大子矩阵面积...
- HDU 1505 City Game (单调栈+最大子矩阵面积)
- HDU 2870 Largest Submatrix(最大子矩阵面积)
- 面积最大的全1子矩阵(腾讯2012年暑期实习生招聘面试二面试题)
- 暑期dp46道(40)--HDOJ 2830 最大子矩阵面积 额
- 【DP求最大子矩阵面积】hdu 1506
- 题目1497:面积最大的全1子矩阵
- HDU 4386 给出四条边长求最大面积
- 一道小米的关于柱状图求最大矩阵面积的题
- 面积最大的全1子矩阵
- hdu 1081 矩阵最大连续子序列
- HDU 3934 Summer holiday 旋转卡壳 最大三角形面积
- 面积最大的全1子矩阵
- 题目1497:面积最大的全1子矩阵
- HDU 2830 Matrix Swapping II(最大完全子矩阵之可移动列)