您的位置:首页 > 其它

普及练习场 多维动态规划 最大正方形

2018-01-15 16:06 381 查看
题目链接

题意理解

这个题目我做过数据加强版本的,当时是用二分做的,不过好像TLE了。不过这次的数据量来看,是可以直接暴力求解的。当然考虑到这个题目放在了动态规划这个专题里面,那么递推方程还是不复杂的。dp[i][j] 表示当前位置从左方、上方、左上方来看,选[i][j]这个点可以保证的正方形的最大边长。然后每个点往左边,左上方,上方拓展。

代码

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
static final int maxn = 110;
static int N, M;
static int[][] a = new int[maxn][maxn];
static int[][] dp = new int[maxn][maxn];
public static void main(String[] args) {
FastScanner fs = new FastScanner();
N = fs.nextInt();
M = fs.nextInt();
int max = -1;
for(int i = 1; i <= N; i++) {
for(int j = 1; j <= M; j++) {
a[i][j] = fs.nextInt();
if(a[i][j] > 0) {
dp[i][j] = mmin(dp[i-1][j-1], dp[i-1][j], dp[i][j-1]) + 1;
}
if(dp[i][j] > max) {
max = dp[i][j];
}
}
}
System.out.println(max);

}
public static int mmin(int a, int b, int c) {
int t1 = Math.min(a, b);
int t2 = Math.min(t1, c);
return t2;
}
public static class FastScanner {
private BufferedReader br;
private StringTokenizer st;
public FastScanner() {
br = new BufferedReader(new InputStreamReader(System.in));
}

public String nextToken() {
while(st == null || !st.hasMoreElements()) {
try {
st = new StringTokenizer(br.readLine());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return st.nextToken();
}

public int nextInt() {
return Integer.valueOf(nextToken());
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: