zoj 2067 - White Rectangles
来源:互联网 发布:伦斯勒理工大学知乎 编辑:程序博客网 时间:2024/06/01 09:18
题目:一个由‘.’和‘#’组成矩形,统计里面'.'组成的矩形的个数。
分析:经典dp。计算之前要做很多预处理。
状态:f(i,j)为,以点(i,j)作为右下角顶点的矩形的个数;
首先,统计每个'.'元素,所在行以他为结束标志的连续的'.'的长度L(i,j);
然后,从点(i,j)向左上运动,计算对应的高度的矩形个数maxL(i,j,k);
转移:f(i,j)= sum(maxL(i,j,k)) { 其中,0 < k ≤ j };
(maxL(i,j,k)为从k到i的每行以j为结束标志的矩形最大公共长度)。
说明:(2011-11-02 12:25)。
#include <stdio.h>#include <stdlib.h>#include <string.h>char maps[ 105 ][ 105 ];int line[ 105 ][ 105 ];int minl[ 105 ][ 105 ];int rect[ 105 ][ 105 ];int main(){ int n; while ( scanf("%d",&n) != EOF ) { for ( int i = 1 ; i <= n ; ++ i ) scanf("%s",&maps[ i ][ 1 ]); memset( line, 0, sizeof( line ) ); memset( rect, 0, sizeof( rect ) ); for ( int i = 1 ; i <= n ; ++ i ) for ( int j = 1 ; j <= n ; ++ j ) if ( maps[ i ][ j ] == '.' ) line[ i ][ j ] = line[ i ][ j-1 ]+1; for ( int i = 1 ; i <= n ; ++ i ) for ( int j = 1 ; j <= n ; ++ j ) { int minL = line[ i ][ j ]; for ( int k = i ; k >= 1 ; -- k ) { if ( minL > line[ k ][ j ] ) minL = line[ k ][ j ]; if ( !minL ) break; rect[ i ][ j ] += minL; } } int sum = 0; for ( int i = 1 ; i <= n ; ++ i ) for ( int j = 1 ; j <= n ; ++ j ) sum += rect[ i ][ j ]; printf("%d\n",sum); } return 0;}
0 0
- zoj 2067 - White Rectangles
- ZOJ 2067 HDU 1510 White Rectangles
- White Rectangles
- hdu 1510 white rectangles
- ZOJ2067 White Rectangles
- White Rectangles(hdu 1510)
- 1510 White Rectangles
- zoj 1179 Finding Rectangles
- ZOJ2067 White Rectangles 很好的DP递推啊
- hdu1510 White Rectangles(组合计数问题)
- zoj 1139 || poj 1468 Rectangles
- ZOJ 1179 Finding Rectangles(DFS+剪枝)
- Rectangles
- Rectangles
- Rectangles
- Rectangles
- Rectangles
- White
- sax封装xml文档数据
- leetcode-Multiply Strings
- OpenCV基础篇之查找表
- 使用java技术将Excel表格内容导入mysql数据库
- 漏洞修复之阿里云bash shell漏洞
- zoj 2067 - White Rectangles
- 大神博客笔试(转)
- 深入分析Volatile的实现原理
- QQ在线客服
- leetcode-Spiral Matrix
- CentOS上编译安装OpenCV-2.3.1与ffmpeg-2.1.2
- rman概念(读书笔记)
- OpenCV基础篇之读取显示图片
- 黑马程序员——异常处理复习笔记