题解
2025-08-04 17:11:25
发布于:上海
15阅读
0回复
0点赞
两种方法:
1.暴力骗分(只不过只有50分)
#include<iostream>
using namespace std;
const int N=1e3+5;
int a[N][N],sum[N][N];
int n,m;
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
char c;
cin>>c;
if(c=='F')a[i][j]=1;
else a[i][j]=-1e4;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
sum[i][j]=a[i][j]-sum[i-1][j-1]+sum[i-1][j]+sum[i][j-1];
int ans=-1e9;
for(int i=0;i<=n;i++)
for(int j=0;j<=m;j++)
for(int k=i+1;k<=n;k++)
for(int l=j+1;l<=m;l++)
if(ans<sum[k][l]+sum[i][j]-sum[i][l]-sum[k][j])
ans=sum[k][l]+sum[i][j]-sum[i][l]-sum[k][j];
cout<<3*ans;
return 0;
}
2.单调栈(满分答案)
#include<iostream>
#include<stack>
using namespace std;
int a[1005][1005],dp[1005][1005];
char g[1005][1005];
int n,m;
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
cin>>g[i][j];
if(g[i][j]=='F')dp[i][j]=dp[i-1][j]+1;
else dp[i][j]=0;
}
int ans=0;
stack<int>s;
for(int i=1;i<=n;i++){
for(int j=1;j<=m+1;j++){
while(s.size() && dp[i][s.top()]>dp[i][j]){
int idx=s.top();
s.pop();
int width;
if(s.empty())width=j-1;
else width=j-s.top()-1;
int area=dp[i][idx]*width;
if(area>ans)ans=area;
}
s.push(j);
}
}
cout<<ans*3;
return 0;
}
这里空空如也
有帮助,赞一个