UVa 10074

题意:求01矩阵的最大子0矩阵。

http://www.csie.ntnu.edu.tw/~u91029/MaximumSubarray.html#2

这里说的很清楚。先求Largest Empty Interval,枚举每个点为矩形的右下角。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN = ;
int Map[MAXN][MAXN], width[MAXN][MAXN];
int row, col; int main()
{
while (cin>>row>>col&&!(row==&&col==))
{
int ans = ;
for(int i=;i<=row;i++)
for (int j = ; j <= col; j++) {
cin >> Map[i][j];
if (Map[i][j]) width[i][j] = ;
else width[i][j] = width[i][j - ] + ;
}
for (int i = ; i <= row; i++)
{
for (int j = ; j <= col; j++) {
int w = 1e9;
for (int h = ; i - h + > ; h++) {
if (Map[i][j]) break;
w = min(w, width[i - h + ][j]);
ans = max(ans, w*h);
}
}
}
cout << ans << endl;
}
return ;
}

按照下一个更高效的算法写,不知道为什么会WA,可能是哪里有问题。。。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN = ;
int Map[MAXN][MAXN];
int wl[MAXN], wr[MAXN];
int h[MAXN], l[MAXN], r[MAXN];
int row, col; int main()
{
while (scanf("%d%d", &row, &col) == , !(row == && col == ))
{
int ans = ;
for (int i = ; i <= row; i++)
for (int j = ; j <= col; j++)
scanf("%d", &Map[i][j]);
for (int i = ; i <= row; i++)
{
for (int j = ; j <= col; j++)
if (Map[i][j]) wl[j] = ;
else wl[j] = wl[j - ] + ; for (int j = col; j >= ; j--)
if (Map[i][j]) wr[j] = ;
else wr[j] = wr[j + ] + ; for (int j = ; j <= row; j++)
if (Map[i][j]) h[j] = ;
else h[j] = h[j] + ; for (int j = ; j <= col; j++)
if (r[j] == ) r[j] = wr[j];
else r[j] = min(wr[j], r[j]); for (int j = ; j <= col; j++)
if (l[j] == ) l[j] = wl[j];
else l[j] = min(wl[j], l[j]); for (int j = ; j <= col; j++)
ans = max(ans, (l[j] + r[j] - )*h[j]);
}
printf("%d\n", ans);
}
return ;
}

WA1

最高效的按照栈那种方式写也是WA。。。。。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stack>
using namespace std;
const int MAXN = ;
int a[MAXN][MAXN], h[MAXN][MAXN];
int col, row; int main()
{
while (cin >> row >> col)
{
if (!col && !row) break;
for (int i = ; i <= row; i++)
for (int j = ; j <= col; j++)
cin >> a[i][j];
memset(h, , sizeof(h));
for (int i = ; i <= row; i++)
for (int j = ; j <= col; j++)
if (a[i][j]) h[i][j] = ;
else h[i][j] = h[i - ][j] + ; stack<int> st;
int area;
int mx = ;
for (int i = ; i <= row; i++)
{
int j;
for (j = ; j <= col;) {
if (st.empty() || h[i][st.top()] <= h[i][j])
st.push(j++);
else {
int top = st.top();
st.pop();
if (st.empty())
area = h[i][top] * j;
else
area = h[i][top] * (j - st.top() - );
mx = max(mx, area);
}
}
while (!st.empty())
{
int top = st.top();
st.pop();
if (st.empty()) area = h[i][top] * j;
else
area = h[i][top] * (j - st.top() - );
mx = max(mx, area);
}
}
cout << mx << endl;
}
return ;
}

WA2

Uva 10074【递推dp】的更多相关文章

  1. 递推DP UVA 607 Scheduling Lectures

    题目传送门 题意:教授给学生上课,有n个主题,每个主题有ti时间,上课有两个限制:1. 每个主题只能在一节课内讲完,不能分开在多节课:2. 必须按主题顺序讲,不能打乱.一节课L时间,如果提前下课了,按 ...

  2. 递推DP URAL 1167 Bicolored Horses

    题目传送门 题意:k个马棚,n条马,黑马1, 白马0,每个马棚unhappy指数:黑马数*白马数,问最小的unhappy值是多少分析:dp[i][j] 表示第i个马棚放j只马的最小unhappy值,状 ...

  3. 递推DP URAL 1017 Staircases

    题目传送门 /* 题意:给n块砖头,问能组成多少个楼梯,楼梯至少两层,且每层至少一块砖头,层与层之间数目不能相等! 递推DP:dp[i][j] 表示总共i块砖头,最后一列的砖头数是j块的方案数 状态转 ...

  4. 递推DP URAL 1260 Nudnik Photographer

    题目传送门 /* 递推DP: dp[i] 表示放i的方案数,最后累加前n-2的数字的方案数 */ #include <cstdio> #include <algorithm> ...

  5. 递推DP URAL 1353 Milliard Vasya's Function

    题目传送门 /* 题意:1~1e9的数字里,各个位数数字相加和为s的个数 递推DP:dp[i][j] 表示i位数字,当前数字和为j的个数 状态转移方程:dp[i][j] += dp[i-1][j-k] ...

  6. 递推DP URAL 1119 Metro

    题目传送门 /* 题意:已知起点(1,1),终点(n,m):从一个点水平或垂直走到相邻的点距离+1,还有k个抄近道的对角线+sqrt (2.0): 递推DP:仿照JayYe,处理的很巧妙,学习:) 好 ...

  7. 递推DP 赛码 1005 Game

    题目传送门 /* 递推DP:官方题解 令Fi,j代表剩下i个人时,若BrotherK的位置是1,那么位置为j的人是否可能获胜 转移的时候可以枚举当前轮指定的数是什么,那么就可以计算出当前位置j的人在剩 ...

  8. 递推DP HDOJ 5328 Problem Killer

    题目传送门 /* 递推DP: 如果a, b, c是等差数列,且b, c, d是等差数列,那么a, b, c, d是等差数列,等比数列同理 判断ai-2, ai-1, ai是否是等差(比)数列,能在O( ...

  9. hdu1978(递推dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1978 分析: 递推DP. dp[][]表示可以到达改点的方法数. 刚开始:外循环扫描所有点dp[x][ ...

  10. 递推DP URAL 1031 Railway Tickets

    题目传送门 /* 简单递推DP:读题烦!在区间内的都更新一遍,dp[]初始化INF 注意:s1与s2大小不一定,坑! 详细解释:http://blog.csdn.net/kk303/article/d ...

随机推荐

  1. Leetcode561.Array Partition I数组拆分1

    给定长度为 2n 的数组, 你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), ..., (an, bn) ,使得从1 到 n 的 min(ai, bi) 总和最大. 示例 ...

  2. bzoj 1800 [Ahoi2009]fly 飞行棋——模拟

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1800 原来只想到一个弧是一条边. 然后发现不是.差点不会做.经Zinn提醒,不用枚举那条边由 ...

  3. node学习记录——搭建web服务器

    web服务器的基本知识 功能:1.接收HTTP请求(get,post,delete,put)2.处理HTTP请求 常见的web服务器架构: 1. Nginx/Apache:负责接收http请求,确定谁 ...

  4. jS生成二叉树,二叉树的遍历,查找以及插入

    js递归,二叉树的操作 //递归算法n次幂 function foo(n) { if (n == 1) { return 1; } else { return n * foo(n - 1); } } ...

  5. 13类100个常用Linux基础命令

    玩过Linux的人都会知道,Linux中的命令的确是非常多,但是玩过Linux的人也从来不会因为Linux的命令如此之多而烦恼,因为我们只需要掌握我们最常用的命令就可以了.然而每个人玩Linux的目的 ...

  6. day38 05-Spring的BeanFactory与ApplicationContext区别

    ApplicationContext怎么知道它是一个工厂呢? BeanFactory也可以做刚才那些事情,只不过ApplicationContext对它有扩展.ApplicationContext间接 ...

  7. Promise对象和async函数

    Promise对象 //1开始 function fna(){ console.log('1开始'); var p = new Promise(function(resolve, reject){ / ...

  8. DesktopLayer.exe专杀

    这两天发现电脑卡慢. 同事电脑发现病毒,而后装上杀软后(一直在裸奔~~~),发现自己电脑也存在. DesktopLayer.exe 会有以下几个行为: 第一,会在C:\Program Files (x ...

  9. IP地址与,域名,DNS服务器,端口号的联系与概念

    一,什么是IP地址? 每一个联入到Internet的计算机都需要一个世界上独一无二的IP地址,相当于人们的身份证号码! IP地址有A类,B类,C类,D类和E类之分,目前D类和E类都暂时作为保留地址! ...

  10. 运行Jmeter时,响应数据中文乱码问题解决办法

    需要修改jmeter中的配置,在Jmeter安装目录/bin/jmeter.properties文件中进行修改: sampleresult.default.encoding默认为ISO-8859-1, ...