加权变成最大子矩阵和,一维矩阵和 + dp最大子序列。O(n3), 惊险AC。
图片+代码如下:
(
)
#include <bits/stdc++.h>
using namespace std;
int sum[1005][1005];
const int INF = -1e5;
int dp[1005];
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int n, m;
cin >> n >> m;
for(int i = 1; i <= n; ++ i) {
for(int j = 1; j <= m; ++ j) {
char c;
cin >> c;
if(c == 'R') sum[i][j] = INF;
else sum[i][j] = 1;
sum[i][j] += sum[i][j - 1];
}
}
int ans = 0;
for(int l = 1; l <= m; ++ l) { // 开始列
for(int r = l; r <= m; ++ r) { // 结束列
memset(dp, 0, sizeof(dp));
for(int i = 1; i <= n; ++ i) {
int t = sum[i][r] - sum[i][l - 1];
dp[i] = max(dp[i - 1] + t, t);
ans = max(ans, dp[i]);
}
}
}
cout << 3 * ans;
return 0;
}