标签:des style color java os io strong 数据
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 4572 Accepted Submission(s): 1938
2 5 6 R F F F F F F F F F F F R R R F F F F F F F F F F F F F F F 5 5 R R R R R R R R R R R R R R R R R R R R R R R R R
45 0
扫描线的第一个题,题目大意:给出m*n的矩阵,R是不能占用的,F是可占用的,每占用一个F要花费3,问,占用的F组成最大的矩形时的花费
扫描线,从上向下扫描,对于每个数存下,到该点时的矩形的最大高度,矩形的左边,右边,可以通过这个计算矩形的大小,如果该点是R,那么高度是0,否则,高度+1,由该点可到的左边和上一层可到的左边共同决定该点的左边。也就是 p[i][j].l = max( p[i][j].l,p[i-1][j].l ),要求最接近该点的。
这样操作后,每个点储存的都是到给点结束时的最大矩形,找出所有点的最大值就可以了。
在输入是既要判断F 也要判断R,不然一直WA
在杭电这份代码是A的,但是其他的oj就不行了,数据水啊
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; struct node { int l , r , k , h ; } p[1100][1100] ; void init(int n,int m) { int i , j , l , r ; char ch[10] ; for(i = 1 ; i <= n ; i++) { for(j = 1 ; j <= m ; j++) { scanf("%s", ch); if( ch[0] == 'R' ) p[i][j].k = 0 ; else if( ch[0] == 'F' ) p[i][j].k = 1 ; } for(j = 1 , l = 1 ; j <= m ; j++) { if( p[i][j].k == 0 ) { p[i][j].l = -1 ; l = j+1 ; } else p[i][j].l = l ; } for(j = m , r = m ; j >= 1 ; j--) { if( p[i][j].k == 0 ) { p[i][j].r = 999999 ; r = j - 1 ; } else p[i][j].r = r ; } } } int main() { int t , i , j , n , m , l , r , temp , ans ; char ch ; scanf("%d", &t); while(t--) { ans = -1 ; scanf("%d %d", &n, &m); init(n,m); for(i = 1 ; i <= m ; i++) { if( p[1][i].k == 1 ) p[1][i].h = 1 ; else p[1][i].h = 0 ; temp = p[1][i].h * ( p[1][i].r - p[1][i].l + 1); if( temp > ans ) ans = temp ; } for(i = 2 ; i <= n ; i++) { for(j = 1 ; j <= n ; j++) { if( p[i][j].k == 0 ) { p[i][j].h = 0 ; } else { p[i][j].h = p[i-1][j].h + 1 ; p[i][j].l = max( p[i][j].l,p[i-1][j].l ); p[i][j].r = min( p[i][j].r,p[i-1][j].r ); } temp = p[i][j].h * ( p[i][j].r - p[i][j].l + 1 ); if(temp > ans) ans = temp ; } } printf("%d\n", ans*3); } return 0; }
多加了一个判断是不是m行,每行是不是n个。。。。
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; struct node { int l , r , k , h ; } p[1100][1100] ; void init(int n,int m) { int i , j , l , r , ll , top ; char str[10000] ; memset(p,0,sizeof(p)); for(i = 1 ; i <= n ; i++) { gets(str); if( str[0] == '\n' ) break; ll = strlen(str); top = 1 ; for(j = 0 ; j < ll ; j++) { if( str[j] == 'F' ) p[i][top++].k = 1 ; else if( str[j] == 'R' ) p[i][top++].k = 0 ; } } for(i = 1 ; i <= n ; i++) { for(j = 1 , l = 1 ; j <= m ; j++) { if( p[i][j].k == 0 ) { p[i][j].l = -1 ; l = j+1 ; } else p[i][j].l = l ; } for(j = m , r = m ; j >= 1 ; j--) { if( p[i][j].k == 0 ) { p[i][j].r = 999999 ; r = j - 1 ; } else p[i][j].r = r ; } } } int main() { int t , i , j , n , m , l , r , temp , ans ; char ch ; scanf("%d", &t); while(t--) { ans = -1 ; scanf("%d %d ", &n, &m); init(n,m); for(i = 1 ; i <= m ; i++) { if( p[1][i].k == 1 ) p[1][i].h = 1 ; else p[1][i].h = 0 ; temp = p[1][i].h * ( p[1][i].r - p[1][i].l + 1); if( temp > ans ) ans = temp ; } for(i = 2 ; i <= n ; i++) { for(j = 1 ; j <= n ; j++) { if( p[i][j].k == 0 ) { p[i][j].h = 0 ; } else { p[i][j].h = p[i-1][j].h + 1 ; p[i][j].l = max( p[i][j].l,p[i-1][j].l ); p[i][j].r = min( p[i][j].r,p[i-1][j].r ); } temp = p[i][j].h * ( p[i][j].r - p[i][j].l + 1 ); if(temp > ans) ans = temp ; } } printf("%d\n", ans*3); } return 0; }
hdu1505--City Game(扫描线+坑啊 ),布布扣,bubuko.com
标签:des style color java os io strong 数据
原文地址:http://blog.csdn.net/winddreams/article/details/38488397