题目1102:最小面积子矩阵
来源:互联网 发布:米5登不了淘宝手机助手 编辑:程序博客网 时间:2024/06/06 02:29
java实现:
/********* * 矩阵求和 * sum[i][j] = sum[i - 1][j] + sum[i][j - 1] + maze[i][j]; * 状态转移方程: * dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) * 同时再求以(i,j)为矩阵右下角情况下的最小值 */import java.io.IOException;import java.io.BufferedReader;import java.io.InputStreamReader;import java.io.FileReader;import java.util.Scanner;class Main{public static final boolean DEBUG = false;public static final int N = 110;public static void main(String[] args) throws IOException{Scanner cin;int n, m, k;int min;if (DEBUG) {cin = new Scanner(new FileReader("d:\\OJ\\uva_in.txt"));} else {cin = new Scanner(new InputStreamReader(System.in));}int[][] maze = new int[N][N];int[][] sum = new int[N][N];int[][] dp = new int[N][N];while (cin.hasNext()) {n = cin.nextInt();m = cin.nextInt();k = cin.nextInt();for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {maze[i][j] = cin.nextInt();}}for (int i = 0; i <= n; i++) {sum[i][0] = 0;dp[i][0] = -1;maze[i][0] = 0;}for (int i = 0; i <= m; i++) {sum[0][i] = 0;maze[0][i] = 0;dp[0][i] = -1;}for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {sum[i][j] = sum[i - 1][j] + sum[i][j - 1] - sum[i - 1][j - 1] + maze[i][j];}}for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {if (-1 == dp[i - 1][j] && -1 == dp[i][j - 1]) {if (sum[i][j] < k) dp[i][j] = -1;else {min = i * j;for (int x = 1; x <= i; x++) {for (int y = 1; y <= j; y++) {if (sum[i][j] - sum[x - 1][j] - sum[i][y - 1] + sum[x - 1][y - 1] >= k && (i - x + 1) * (j - y + 1) < min)min = (i - x + 1) * (j - y + 1);}}dp[i][j] = min;}} else {if (dp[i - 1][j] > 0 && dp[i][j - 1] == -1) dp[i][j] = dp[i - 1][j];else if (dp[i - 1][j] == -1 && dp[i][j - 1] > 0) dp[i][j] = dp[i][j - 1];else dp[i][j] = (dp[i - 1][j] > dp[i][j - 1] ? dp[i][j - 1] : dp[i - 1][j]);min = dp[i][j];for (int x = i; i - x + 1 < dp[i][j] && x >= 1; x--) {for (int y = j; j - y + 1 <= dp[i][j] / (i - x + 1) && y >= 1; y--) {if (sum[i][j] - sum[x - 1][j] - sum[i][y - 1] + sum[x - 1][y - 1] >= k && (i - x + 1) * (j - y + 1) < min) min = (i - x + 1) * (j - y + 1);}}dp[i][j] = min;}}}System.out.println(dp[n][m]);}}}
C++实现:
#include <cstdio>using namespace std;const int N = 110;int maze[N][N], sum[N][N], dp[N][N];int main(){ int m, n, k; int i, j, x, y; int Min; #ifndef ONLINE_JUDGE freopen("d:\\OJ\\uva_in.txt", "r", stdin); #endif // ONLINE_JUDGE while (scanf("%d%d%d", &n, &m, &k) != EOF) { for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { scanf("%d", &maze[i][j]); } } for (int i = 0; i <= n; i++) { maze[i][0] = 0; sum[i][0] = 0; dp[i][0] = -1; } for (int i = 0; i <= m; i++) { maze[0][i] = 0; sum[0][i] = 0; dp[0][i] = -1; } for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { sum[i][j] = sum[i - 1][j] + sum[i][j - 1] - sum[i - 1][j - 1] + maze[i][j]; } } for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { if (-1 == dp[i - 1][j] && -1 == dp[i][j - 1]) { if (sum[i][j] < k) dp[i][j] = -1; else { Min = i * j; for (x = 1; x <= i; x++) { for (y = 1; y <= j; y++) { if (sum[i][j] - sum[x - 1][j] - sum[i][y - 1] + sum[x - 1][y - 1] >= k && (i - x + 1) * (j - y + 1) < Min) Min = (i - x + 1) * (j - y + 1); } } dp[i][j] = Min; } } else { if (dp[i - 1][j] > 0 && dp[i][j - 1] == -1) dp[i][j] = dp[i - 1][j]; else if (dp[i - 1][j] == -1 && dp[i][j - 1] > 0) dp[i][j] = dp[i][j - 1]; else dp[i][j] = (dp[i - 1][j] > dp[i][j - 1] ? dp[i][j - 1] : dp[i - 1][j]); Min = dp[i][j]; for (x = i; i - x + 1 < dp[i][j] && x >= 1; x--) { for (y = j; j - y + 1 <= dp[i][j] / (i - x + 1) && y >= 1; y--) { if (sum[i][j] - sum[x - 1][j] - sum[i][y - 1] + sum[x - 1][y - 1] >= k && (i - x + 1) * (j - y + 1) < Min) Min = (i - x + 1) * (j - y + 1); } } dp[i][j] = Min; } } } printf("%d\n", dp[n][m]); } return 0;}
0 0
- 题目1102:最小面积子矩阵
- 题目1102:最小面积子矩阵
- 题目1102:最小面积子矩阵
- 九度[1102]-最小面积子矩阵
- OJ_1102 最小面积子矩阵
- 九度OJ 1102 最小面积子矩阵
- 九度OJ 1102 最小面积子矩阵
- 题目1:最小子矩阵
- 题目1492:最小子矩阵
- 题目1492:最小子矩阵
- 九度OJ 1102 最小面积子矩阵 (+最短连续子序列)
- 九度OJ 1102:最小面积子矩阵 (DP、缓存、剪枝)
- 题目1497:面积最大的全1子矩阵
- 题目1497:面积最大的全1子矩阵
- 题目1497:面积最大的全1子矩阵
- POJ 2185 Milking Grid(最小覆盖子矩阵面积KMP)
- 最大子矩阵面积
- 九度OJ; 题目1497:面积最大的全1子矩阵
- completion
- Codeforces #81E Pairs
- Maven 手动添加 JAR 包到本地仓库
- WCF-006:服务端类的封装问题
- Combination Sum 组合数之和
- 题目1102:最小面积子矩阵
- 春运网络购票诈骗频发 消费者慎防钓鱼陷阱
- 深入浅出Swing事件分发线程
- Combination Sum II 组合数之和(包含有重复的元素)
- HDU 4009 最小树形图裸题
- Struts2文件上传大小控制与提示
- eclipse maven plugin 插件 安装 和 配置
- 斐波纳契(兔子问题)
- [Java] 动态代理 03 --(解决接口也当参数传)