E - Defect-free Squares

Linkkkkkkkkkkkk

這其實是個dp問題

可以拆成一個個dp小問題,然後求和,這個小問題就是以\((i,j)\)爲右下角方塊下會有多少矩形,然後把每一個位置加起來就行了。

應注意到以下命題充要性成立:如果\((i,j)\)位置存在一個正方形長度爲n滿足題意,那麼在\((i-1,j),(i,j-1),(i-1,j-1)\)處都應存在着長度爲 n-1的矩形滿足題意

這樣就可以進行dp了

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<set>
#include<map>
#include<ctime>
#include<bitset>
using namespace std;
int ma[3001][3001];
int h,n,m;
int dp[3001][3001];
int x,y;
long long ans;
int main(){
	scanf("%d%d%d",&n,&m,&h);
	for(int i=1;i<=h;++i){
		scanf("%d%d",&x,&y);
		ma[x][y]=1;
	}
	for(int i=1;i<=n;++i){
		for(int j=1;j<=m;++j){
			if(ma[i][j]) dp[i][j]=0;
			else dp[i][j]=min(min(dp[i-1][j],dp[i][j-1]),dp[i-1][j-1])+1;
			ans+=dp[i][j];
		}
	}
	cout<<ans;
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章