luoguP1169 [ZJOI2007]棋盘制作
作者:互联网
悬线法dp秒杀。。。
#include<bits/stdc++.h>
#define MAXN 2000
using namespace std;
int n,m,ans1,ans2;
int num[MAXN+5][MAXN+5],l[MAXN+5][MAXN+5],r[MAXN+5][MAXN+5],up[MAXN+5][MAXN+5];
void init(){
cin>>n>>m;
for(int i = 1 ; i <= n ; i++){
for(int j = 1 ; j <= m ; j++){
cin>>num[i][j];num[i][j]++;
l[i][j] = r[i][j] = j;
up[i][j] = 1;
}
}
for(int i = 1 ; i <= n ; i++){
for(int j = 2 ; j <= m ;j++){
if(num[i][j-1] != num[i][j])l[i][j] = l[i][j - 1];
}
}
for(int i = 1 ; i <= n ; i++){
for(int j = m - 1 ; j >= 1 ; j--){
if(num[i][j+1] != num[i][j])r[i][j] = r[i][j + 1];
}
}
}
void solve(){
for(int i = 1 ; i <= n ;i++){
for(int j = 1 ; j <= m ; j++){
if(num[i][j] != num[i-1][j] && i != 1){
l[i][j] = max(l[i][j] , l[i-1][j]);
r[i][j] = min(r[i][j] , r[i-1][j]);
up[i][j] = up[i-1][j] + 1;
}
int zz = min(r[i][j] - l[i][j] + 1 , up[i][j]);
int zz2 = (r[i][j] - l[i][j] + 1) * up[i][j];
ans1 = max(ans1 , zz);
ans2 = max(ans2 , zz2);
}
}
cout<<ans1*ans1<<endl;
cout<<ans2<<endl;
}
int main(){
init();
solve();
}
标签:int,ans1,void,up,luoguP1169,num,MAXN,ZJOI2007,棋盘 来源: https://blog.csdn.net/qq_41567618/article/details/104859152