POJ1964/UVALive 3029 -City Game -求最大子矩形-(暴力枚举/dp)
来源:互联网 发布:论坛网站排名数据库 编辑:程序博客网 时间:2024/05/18 00:59
给n*m的地图,只有R/F,求最大的F矩形面积(就是个数),输出答案*3
n,m<=1000
看到三秒。。。大胆尝试一下跑n^3。。。。结果居然在uva卡过了。。2s...
先n^2预处理一下,给这个n*m矩阵涂色:
初始化计数器cnt=0
第一个如果是F,涂颜色++cnt,然后往后遍历,如果是R跳过,如果是F,看和前面一个位置是否也是F,是的话,涂和上一个位置一样的颜色,否则涂新的颜色(++cnt)
这样处理完之后。对于第k行,我们要判断i到j列是否全是F,只需要判断 col[k][i]==col[k][j](当然不能是零)
因此我们m^2枚举最优矩形所在的列数i,j, 然后每一次枚举 用o(n) 找出最优矩形所在的行数,便是答案
uvaLA的题非常坑。。。这题读入用scanf(“%c”)会wa。。估计有多余的空格之类的。。。该成%s就ac 了。。。
发现n^3在uva是2s卡过,在poj是tle。。估计是加强数据了
n^2的解法(dp)和 http://blog.csdn.net/viphong/article/details/47985285 这题类似,该题是求 一维上的最大面积,本题是二维,
我们用up[i][j]表示第i行第j列 这个空格 能往上延伸的最大长度(包括自身)
ll[i][j]表示向左延伸最大长度,rr【i】【j】同理,我们可以n^2得到这三个数组
然后我们n^2枚举每一个格子,更新答案即可,
int ret=up[i][j]*(1+ll[i][j]+rr[i][j]);
if (ret>maxx)
maxx=ret;
dp n^2:
#include <cstdio>#include <cmath>#include <cstring>#include <string>#include <algorithm>#include <queue>#include <map>#include <set>#include <vector>#include <iostream>using namespace std;const double pi=acos(-1.0);double eps=0.000001; char mp[1005][1005];int up[1005][1005]; int ll[1005][1005];int rr[1005][1005];int main(){int n,s; int t;cin>>t;while(t--){memset(up,0,sizeof(up));memset(ll,0,sizeof(ll));memset(rr,0,sizeof(rr));int n,m;int i,j,k;cin>>n>>m;getchar();char sss[10];for (i=1;i<=n;i++){for (j=1;j<=m;j++){scanf("%s",sss);mp[i][j]=sss[0];}} for (i=n;i>=1;i--){for (j=1;j<=m;j++){if (mp[i][j]=='F')up[i][j]=up[i+1][j]+1;elseup[i][j]=0;}}for (i=n;i>=1;i--){for (j=2;j<=m;j++){if (up[i][j]<=up[i][j-1])ll[i][j]=ll[i][j-1]+1;elsell[i][j]=0;}}for (i=n;i>=1;i--){for (j=m-1;j>=1;j--){if (up[i][j]<=up[i][j+1])rr[i][j]=rr[i][j+1]+1;elserr[i][j]=0;}} int maxx=0;for (i=1;i<=n;i++){for (j=1;j<=m;j++){int ret=up[i][j]*(1+ll[i][j]+rr[i][j]);if (ret>maxx) maxx=ret;}}printf("%d\n",maxx*3);}return 0;}
n^3算法:
#include <cstdio>#include <cmath>#include <cstring>#include <string>#include <algorithm>#include <queue>#include <map>#include <set>#include <vector>#include <iostream>using namespace std;const double pi=acos(-1.0);double eps=0.000001; char mp[1005][1005];int col[1005][1005];int main(){int n,s; int t;cin>>t;while(t--){memset(col,0,sizeof(col));int n,m;int i,j,k;cin>>n>>m;getchar();char sss[10];for (i=1;i<=n;i++){for (j=1;j<=m;j++){scanf("%s",sss);mp[i][j]=sss[0];}}int cnt=0;for (i=1;i<=n;i++){for (j=1;j<=m;j++){if (mp[i][j]=='R') continue;if (j==1) col[i][j]=++cnt;if (mp[i][j]==mp[i][j-1])col[i][j]=col[i][j-1];elsecol[i][j]=++cnt;}}int maxx=0;for (i=1;i<=m;i++){for (j=i;j<=m;j++){int tmp=0;for (k=1;k<=n;k++){if (!col[k][i]||!col[k][j]) {tmp=0;continue;}if (col[k][i]==col[k][j]){tmp+=(j-i+1);if (tmp>maxx) maxx=tmp;}else tmp=0; }} }printf("%d\n",maxx*3);}return 0;}
0 0
- POJ1964/UVALive 3029 -City Game -求最大子矩形-(暴力枚举/dp)
- POJ1964 City Game(最大子矩阵)
- poj1964 City Game(最大子矩阵)
- UVALive 3029 City Game 悬线法求最大子矩阵面积 dp
- UVALive 3029 City Game(最大子矩阵+悬线法)
- City Game(DP,最大矩形问题)
- HDU 1505 City Game (最大子矩形面积)
- hdu1505 City Game (最大子矩形)
- HDU 1505 City Game(DP求二维最大子矩阵)
- 【BZOJ3039】玉蟾宫/【HDU1505】【POJ1964】City Game 最大01子矩阵
- HDU1505/POJ1964 City Game
- HDU 1505 City Game-dp-(最大子矩阵模型)
- Hdu 1505 City Game (DP求最大面积)
- 例题1.22 最大子矩阵 City Game UVALive
- hdu1505 City Game二维01矩阵求最大矩形周长
- UVALive 3029 City Game
- City Game (最大子矩阵)
- HDU 1081 求最大子矩形 dp
- 延迟X秒之后执行某个方法
- 51nod 1089 最长回文字串V2(Manacher算法)
- 电源管理事件
- 小结选择器--CSS、JavaScript、JQuery
- 机器学习经典算法logistic回归
- POJ1964/UVALive 3029 -City Game -求最大子矩形-(暴力枚举/dp)
- hdu oj 1062 Text Reverse(字符串)
- Tencent qmail 的一个漏洞
- iOS进阶之旅-图片裁剪
- ACM 767 因子和 (判断一个数是否为素数且输出非素数的所有因子和)
- 想使用“本地项目” 的钥匙串
- MemCache在Windows下环境的搭建及启动
- gif动画生成工具
- MATLAB 绘制函数曲线图