悬线法,dp 求解 P4147 玉蟾宫
悬线法,dp 求解 P4147 玉蟾宫
//悬线法 动态规划 P4147 玉蟾宫
#include <iostream>
using namespace std;
const int N=1010;
int n, m, ans, h[N][N], l[N][N], r[N][N];
char a[1010][1010];
int main()
{cin >> n >> m;for(int i=1; i<=n; ++i){for(int j=1; j<=m; ++j){cin >> a[i][j];//从i 行 j 列向上能到达的高度if(a[i][j]=='F'){h[i][j]=1;}//从 i 行 j 列向左和向右能到达的列号l[i][j]=r[i][j]=j;}}for(int i=1; i<=n; ++i){//顺序 dpfor(int j=2; j<=m; ++j){if(a[i][j]=='F' && a[i][j-1]=='F'){l[i][j]=l[i][j-1];}}//倒序 dpfor(int j=m-1; j>=1; --j){if(a[i][j]=='F' && a[i][j+1]=='F'){r[i][j]=r[i][j+1];}}}for(int i=1; i<=n; ++i){for(int j=1; j<=m; ++j){if(a[i][j]=='F' && a[i-1][j]=='F'){h[i][j]=h[i-1][j]+1;//从 i 行 j 列向上的最长悬线,向左平移能到达的最远左边界l[i][j]=max(l[i][j], l[i-1][j]);//从 i 行 j 列向上的最长悬线,向右平移能到达的最远右边界r[i][j]=min(r[i][j], r[i-1][j]);}if(a[i][j]=='F'){ans=max(ans, h[i][j]*(r[i][j]-l[i][j]+1));// cout << ans << " " << i << " " << j << " " << h[i][j] << " " << l[i][j] << " " << r[i][j] << endl;}}}cout << ans*3 << endl;return 0;
}
/*
2 3
F R F
F F F*/