题目背景
有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地。
题目描述
这片土地被分成N*M个格子,每个格子里写着'R'或者'F',R代表这块土地被赐予了rainbow,F代表这块土地被赐予了freda。
现在freda要在这里卖萌。。。它要找一块矩形土地,要求这片土地都标着'F'并且面积最大。
但是rainbow和freda的OI水平都弱爆了,找不出这块土地,而蓝兔也想看freda卖萌(她显然是不会编程的……),所以它们决定,如果你找到的土地面积为S,它们每人给你S两银子。
输入输出格式
输入格式:
第一行两个整数N,M,表示矩形土地有N行M列。
接下来N行,每行M个用空格隔开的字符'F'或'R',描述了矩形土地。
输出格式:
输出一个整数,表示你能得到多少银子,即(3*最大'F'矩形土地面积)的值。
输入输出样例
说明
对于50%的数据,1<=N,M<=200
对于100%的数据,1<=N,M<=1000
关于图的DP又学了一种叫悬线法的方法
之前学的那种方法只是对正方形比较合适
见代码
#include<bits/stdc++.h> using namespace std; //input by bxd #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define repp(i,a,b) for(int i=(a);i>=(b);--i) #define RI(n) scanf("%d",&(n)) #define RII(n,m) scanf("%d%d",&n,&m) #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k) #define RS(s) scanf("%s",s); #define ll long long #define REP(i,N) for(int i=0;i<(N);i++) #define CLR(A,v) memset(A,v,sizeof A) #define inf 0x3f3f3f3f ////////////////////////////////// const int N=1000+5; int dp[N][N]; int mp[N][N]; int ri[N][N],le[N][N],up[N][N]; int main() { char s; int n,m; RII(n,m); rep(i,1,n) rep(j,1,m) { cin>>s; if(s=='F')mp[i][j]=1; else mp[i][j]=0; ri[i][j]=le[i][j]=j; up[i][j]=1; } rep(i,1,n) rep(j,2,m) if(mp[i][j]==mp[i][j-1]&&mp[i][j]==1) le[i][j]=le[i][j-1]; rep(i,1,n) repp(j,m-1,1) if(mp[i][j]==mp[i][j+1]&&mp[i][j]==1) ri[i][j]=ri[i][j+1]; int ans=0; rep(i,1,n) rep(j,1,m) if(mp[i][j]) { if(i>1) if(mp[i-1][j])//如果状态需要转移的话 { le[i][j]=max(le[i][j],le[i-1][j]); ri[i][j]=min(ri[i][j],ri[i-1][j]); up[i][j]=up[i-1][j]+1; } int d=ri[i][j]-le[i][j]+1; // if(d!=up[i][j])正方形也是矩形 所以不用加 ans=max(ans,d*up[i][j]); } cout<<ans*3; return 0; }