HDU 1505 1506 2830 2870求最大矩阵面积 DP
2013-07-27 14:54
477 查看
题目: http://acm.hdu.edu.cn/showproblem.php?pid=1505
Largest Rectangle in a Histogram 这个题目简单一点,遍历给定的每一个数,求出每一个数的 l[i] 和 r[i] 即连续的左边递减,右边递增边界,求的时候不能直接遍历一遍(会超时的)就需要先记录一下没一点的r[i]
l[i] 后面的就可以由此得到。
1505
1506
题目: http://acm.hdu.edu.cn/showproblem.php?pid=1506
City Game 和上个题相似, 只是加强了一点。外面多加一个循环就可以了。
http://acm.hdu.edu.cn/showproblem.php?pid=2830
这个题目是上一个题目的加强,只是每一列可以任意移动,求由1 组成的最大矩阵面积,处理每一行时,按照,每行的最高值排序,总求最大值。
只是每一行时,排序,求最值。得到的肯定是最优的。
http://acm.hdu.edu.cn/showproblem.php?pid=2870
此题,和上面的基本类似,只是w--a/b x--b/c y--a/c z--a/b/c
我的做法是遍历每一次 ,把 wxyz中可以转换的 依次转化为a b c 之后求这三次的中的最值,其他和上面的做法一样
Largest Rectangle in a Histogram 这个题目简单一点,遍历给定的每一个数,求出每一个数的 l[i] 和 r[i] 即连续的左边递减,右边递增边界,求的时候不能直接遍历一遍(会超时的)就需要先记录一下没一点的r[i]
l[i] 后面的就可以由此得到。
1505
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<math.h> #define PI acos(-1.0) #define max(a,b) (a)>(b)? (a):(b) #define min(a,b) (a)>(b)? (b):(a) #define INT_MIN -0x7FFFFFFF #define INT_MAX 0x7FFFFFFF __int64 n,num[100005]; __int64 l[100005],r[100005]; int main() { // freopen("in.txt","r",stdin); __int64 i,j,k; while(scanf("%I64d",&n),n) { for(i=1;i<=n;i++) { scanf("%I64d",&num[i]); } num[0]=num[n+1]=-1; for(i=1;i<=n;i++) { j=i-1; while(num[i]<=num[j]) { j=l[j]; } l[i]=j; } for(i=n;i>=1;i--) { j=i+1; while(num[i]<=num[j]) { j=r[j]; } r[i]=j; } __int64 ma=-1; for(i=1;i<=n;i++) { ma=max(ma,num[i]*(r[i]-l[i]-1)); } printf("%I64d\n",ma); } return 0; }
1506
题目: http://acm.hdu.edu.cn/showproblem.php?pid=1506
City Game 和上个题相似, 只是加强了一点。外面多加一个循环就可以了。
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<math.h> #define PI acos(-1.0) #define max(a,b) (a)>(b)? (a):(b) #define min(a,b) (a)>(b)? (b):(a) #define INT_MIN -0x7FFFFFFF #define INT_MAX 0x7FFFFFFF int map[1005][1005]; int f[1005][1005]; int l[1005],r[1005]; int main() { // freopen("in.txt","r",stdin); int i,j,k; int n,m; char ch[4]; scanf("%d",&k); while(k--) { scanf("%d%d",&m,&n); for(i=1;i<=m;i++) { for(j=1;j<=n;j++) { scanf("%s",ch); if(ch[0]=='F') map[i][j]=1; else if(ch[0]=='R') map[i][j]=0; } } memset(f,0,sizeof(f)); int ma=0; for(i=1;i<=m;i++) { for(j=1;j<=n;j++) { if(map[i][j]) { f[i][j]=f[i-1][j]+1; } } f[i][0]=f[i][n+1]=-1; for(int q=1;q<=n;q++) { j=q-1; while(f[i][j]>=f[i][q]) { j=l[j]; } l[q]=j; } for(int q=n;q>=1;q--) { j=q+1; while(f[i][j]>=f[i][q]) { j=r[j]; } r[q]=j; } for(j=1;j<=n;j++) ma=max(ma,f[i][j]*(r[j]-l[j]-1)); } printf("%d\n",ma*3); } return 0; }
http://acm.hdu.edu.cn/showproblem.php?pid=2830
这个题目是上一个题目的加强,只是每一列可以任意移动,求由1 组成的最大矩阵面积,处理每一行时,按照,每行的最高值排序,总求最大值。
只是每一行时,排序,求最值。得到的肯定是最优的。
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<math.h> #define PI acos(-1.0) #define max(a,b) (a)>(b)? (a):(b) #define min(a,b) (a)>(b)? (b):(a) #define INT_MIN -0x7FFFFFFF #define INT_MAX 0x7FFFFFFF char map[1005][1005]; int f[1005][1005]; int dp[1005]; int cmp(const void *p1,const void *p2) { return *(int *)p1- *(int *)p2; } int main() { // freopen("in.txt","r",stdin); int i,j,k; int n,m; while(scanf("%d%d",&n,&m)!=EOF) { for(i=0;i<n;i++) scanf("%s",map[i]); memset(f,0,sizeof(f)); int ma=0; for(i=0;i<n;i++) { int ar=0; for(j=0;j<m;j++) { if(map[i][j]=='1') { f[i+1][j+1]=f[i][j+1]+1; dp[++ar]=f[i+1][j+1]; } } qsort(dp+1,ar,sizeof(dp[0]),cmp); for(j=1;j<=ar;j++) { ma=max(ma,dp[j]*(ar-j+1)); } } printf("%d\n",ma); } return 0; }
http://acm.hdu.edu.cn/showproblem.php?pid=2870
此题,和上面的基本类似,只是w--a/b x--b/c y--a/c z--a/b/c
我的做法是遍历每一次 ,把 wxyz中可以转换的 依次转化为a b c 之后求这三次的中的最值,其他和上面的做法一样
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<math.h> #define PI acos(-1.0) #define max(a,b) (a)>(b)? (a):(b) #define min(a,b) (a)>(b)? (b):(a) #define INT_MIN -0x7FFFFFFF #define INT_MAX 0x7FFFFFFF char map[1005][1005]; char ma[1005][1005]; int dp[1005][1005]; int n,m; int l[1005],r[1005]; int maa; void ff(char ch) { int i,j,k; memset(dp,0,sizeof(dp)); for(i=0;i<n;i++) { for(j=0;j<m;j++) { ma[i][j]=map[i][j]; if(ma[i][j]=='w' && (ch=='a' || ch=='b')) ma[i][j]=ch; else if(ma[i][j]=='x' && (ch=='b' || ch=='c')) ma[i][j]=ch; else if(ma[i][j]=='y' && (ch=='a' || ch=='c')) ma[i][j]=ch; else if(ma[i][j]=='z') ma[i][j]=ch; } } for(i=0;i<n;i++) { for(j=0;j<m;j++) { if(ma[i][j]==ch) { dp[i+1][j+1]=dp[i][j+1]+1; } } dp[i+1][0]=dp[i+1][m+1]=-1; for(int q=1;q<=m;q++) { j=q-1; while(dp[i+1][q]<=dp[i+1][j]) { j=l[j]; } l[q]=j; } for(int q=m;q>=1;q--) { j=q+1; while(dp[i+1][q]<=dp[i+1][j]) { j=r[j]; } r[q]=j; } for(j=1;j<=m;j++) maa=max(maa,dp[i+1][j]*(r[j]-l[j]-1)); } } int main() { // freopen("in.txt","r",stdin); int i,j,k; while(scanf("%d%d",&n,&m)!=EOF) { for(i=0;i<n;i++) scanf("%s",map[i]); maa=0; ff('a'); ff('b'); ff('c'); printf("%d\n",maa); } return 0; }
相关文章推荐
- 【DP求最大子矩阵面积】hdu 1506
- hdu 1505 && hdu1506 &&hdu 2830 && 2870 总结---------DP之状图选最大矩形
- HDU 1505 City Game【矩阵的最大面积】
- HDU 2830 dp最大完全矩阵Matrix Swapping
- HDU 1505 City Game (单调栈+最大子矩阵面积)
- hdu 1506 最大矩阵面积 __int64 AC long long TLE
- HDU 2870 Largest Submatrix(最大子矩阵面积)
- HDU 1506 DP 最大完全子矩阵
- HDU-2870 Largest Submatrix (线性dp 最大01矩阵)(2009 Multi-University Training Contest 7 )
- HDU 1506 dp求最大子矩阵 *
- 暑期dp46道(40)--HDOJ 2830 最大子矩阵面积 额
- 动态规划求最大子矩阵详解(hdu 1505,1506 , 2870)
- HDU 2870 最大子矩阵,联系1505, 1506
- HDU1505、2870,2830(最大的10矩阵面积问题)
- HDU-1506 || HDU-1505 || HDU-2870 || HDU-2830
- HDU 1506 1505 2870 2830
- HDU_1505_矩阵中的最大矩形_dp
- Hdu 1505 City Game (DP求最大面积)
- HDU 2870【DP_求最大矩阵】
- 暑期dp46道(39)--HDOJ 2870 最大子矩阵面积...