因为数据较小没有用分治算法
有一天,小猫 rainbow 和 freda 来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地。
这片土地被分成 N×MN×M 个格子,每个格子里写着 R
或者 F
,R
代表这块土地被赐予了 rainbow,F
代表这块土地被赐予了 freda。
现在 freda 要在这里卖萌。。。它要找一块矩形土地,要求这片土地都标着 F
并且面积最大。
但是 rainbow 和 freda 的 OI 水平都弱爆了,找不出这块土地,而蓝兔也想看 freda 卖萌(她显然是不会编程的……),所以它们决定,如果你找到的土地面积为 SS,它们将给你 3×S3×S 两银子。
输入格式
第一行包括两个整数 N,MN,M,表示矩形土地有 NN 行 MM 列。
接下来 NN 行,每行 MM 个用空格隔开的字符 F
或 R
,描述了矩形土地。
每行末尾没有多余空格。
输出格式
输出一个整数,表示你能得到多少银子,即(3×3×最大 F
矩形土地面积)的值。
数据范围
1≤N,M≤10001≤N,M≤1000
输入样例:
5 6
R F F F F F
F F F F F F
R R R F F F
F F F F F F
F F F F F F
输出样例:
45
代码解答
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
int daxiao=0;
int N,M;
N=in.nextInt();
M=in.nextInt();
String [][]fuz=new String[N][M];
for(int i=0;i<N;++i){
for(int j=0;j<M;j++){
fuz[i][j]=in.next();
}
}
for(int o=0;o<N*M;++o) {
if (fuz[o/M][o%M].equals("R")){
int panduan;
//上
panduan=0;
for(int y=0;y<o/M;++y){
for(int x=0;x<M;++x){
if(fuz[y][x].equals("R")){
panduan++;
}
}
}
if(panduan==0){
if((o/M)*M>daxiao){
daxiao=(o/M)*M;
}
}
//下
panduan=0;
for(int y=o/M+1;y<N;++y){
for(int x=0;x<M;++x){
if(fuz[y][x].equals("R")){
panduan++;
}
}
}
if(panduan==0){
if((N-((o/M)+1))*M>daxiao){
daxiao=(o/M)*M;
}
}
//左
panduan=0;
for(int x=0;x<o%M;++x){
for(int y=0;y<N;++y){
if(fuz[y][x].equals("R")){
panduan++;
}
}
}
if(panduan==0){
if(((o%M)-1)*N>daxiao){
daxiao=(o/M)*M;
}
}
//右
panduan=0;
for(int x=o%M+1;x<M;++x){
for(int y=0;y<N;++y){
if(fuz[y][x].equals("R")){
panduan++;
}
}
}
if(panduan==0){
if((o%M+1)*N>daxiao){
daxiao=(o%M+1)*N;
}
}
}
}
System.out.println(daxiao*3);
}