농경지 개수【DP】

7582 단어 DP

제목:


너의 고향은 하북 농촌에 있다.설을 쇨 때 너는 고향에 가서 세배를 한다.너희 집에는 N  M 농지가 있는데, 이를 N  M의 격자 행렬로 보고, 어떤 격자 행렬은 수역이다.너의 농촌 아저씨는 네가 컴퓨터를 배운다는 말을 듣고 너에게 문제를 냈다. 그는 너에게 물었다. 이 농지는 모두 수역이 존재하지 않는 정사각형 농지를 얼마나 많이 포함하고 있느냐고.


두 정사각형 농경지는 서로 다르기 때문에 적어도 아래의 두 가지 조건 중 하나를 포함해야 한다.


모서리 길이가 같지 않습니다.


왼쪽 상단의 격자는 같은 격자가 아니다


입력:


데이터 입력 첫 번째 행위는 빈칸에서 분리된 두 개의 정수 N, M(1<=m 두 번째 줄에서 N+1 줄까지 줄마다 M개의 숫자(0 또는 1)가 있어 이 농지를 묘사한다.0은 이 네모가 수역이고 그렇지 않으면 농토임을 나타낸다(주의: 숫자 사이에 빈칸이 없고 줄마다 빈칸이 나타나지 않는다)


샘플 입력:

3 3                                               
1 1 0
1 1 0
0 0 0     

출력:


조건을 충족시키는 정사각형 농지 개수.


샘플 출력:

5

아이디어:


(1) F[I, J]를 설정하면 사각형(I, J)을 오른쪽 하각으로 하고 얻을 수 있는 최대 무수 정사각형의 길이를 나타낸다. 만약에 (I, J)가 수역이라면 F[I, J]=0;그렇지 않으면 F[I,J]=Min{F[I-1,J],F[I,J-1],F[I-1,J-1]}+1


(2) F수 그룹의 값을 구한 후에 우리는 F1[I]로 F수 그룹의 값이 I인 개수를 나타낼 수 있다.


(3) 모서리 길이가 I인 정사각형의 수를 Sum[I]로 가정하면 Sum[I]=Sum[I+1]+F1[I]


(4) 마지막으로 Sum수 그룹의 각 값의 합을 계산하여 문제의 해를 풀기만 하면 된다.


코드:

#include
#include
using namespace std;
int n,m,sum,f[1001][1001];//   。
char c;
int main()
{
	scanf("%d%d",&n,&m);//  。
	for(int i=1;i<=n;i++)
	for(int j=1;j<=m;j++)
	{
		c=getchar();//      
		while(!(c>='0')&&(c<='9'))c=getchar();//  。
		if (c==49) 
		f[i][j]=min(f[i-1][j-1],min(f[i-1][j],f[i][j-1]))+1;//      
		sum=sum+f[i][j];//  。
	}
	printf("%d",sum);//  。
	return 0;
}

좋은 웹페이지 즐겨찾기