HDU4846->区间DP

来源:互联网 发布:塞班软件下载网站 编辑:程序博客网 时间:2024/05/29 03:39

题意:给出一个图,求图中不包含‘#’的正方形的最大边长

题解:DP解决,dp[i][j]代表以(i,j)为右下角顶点的正方形的最大边长

            状态转移方程:if(MAP[i][j]=='#') dp[i][j] = 0 ;

                                        else  dp[i][j] = min(dp[i][j-1] , min(dp[i-1][j] , dp[i-1][j-1]))+1 ;

#include <stdio.h>#include <iostream>#include <string.h>#include <algorithm>using namespace std ;#define MAX 1005int m , num , ans;int dp[MAX][MAX] ;char MAP[MAX][MAX] ;void DP(){for(int i = 0 ; i <= m ; i ++){dp[i][0] = 0 ;dp[0][i] = 0 ;}for(int i = 1 ; i <= m ; i ++){for(int j = 1 ; j <= m ; j ++){if(MAP[i][j] == '#') dp[i][j] = 0 ;else{dp[i][j] = min(dp[i][j-1] , min(dp[i-1][j] , dp[i-1][j-1]))+1 ;}ans = max(ans , dp[i][j]) ;}}}int main(){while(scanf("%d%d" , &m , &num) != EOF){memset(MAP , '.' , sizeof(MAP)) ;int x , y ;while(num--){scanf("%d%d" , &x , &y) ;MAP[x][y] = '#' ;}ans = 0;DP();printf("%d\n", ans);}return 0;}


0 0
原创粉丝点击