ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

luoguP1169 [ZJOI2007]棋盘制作

2020-03-14 14:05:40  阅读:226  来源: 互联网

标签:int ans1 void up luoguP1169 num MAXN 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有