fork download
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. const int maxn = 405;
  6. const int maxval = 1e6;
  7.  
  8. int pos[maxn*maxn+5][maxn+5], dp[maxn+5][maxn+5], a[maxn+5][maxn+5];
  9. vector<pair<int, int>> v[maxval+5];
  10. int n, m;
  11. void read() {
  12. cin >> m >> n;
  13. for (int i = 1; i<=m; ++i) {
  14. for (int j = 1; j<=n; ++j) cin >> a[i][j];
  15. }
  16. }
  17. void solve() {
  18. for (int i = 1; i <= m; ++i) {
  19. for (int j = 1; j <= n; ++j)
  20. v[a[i][j]].push_back({i, j}); //val.push_back
  21. }
  22. int cnt = 0;
  23. for (int i = 1; i < maxval; ++i) {
  24. for (auto p : v[i])
  25. a[p.first][p.second] = cnt;
  26. if (!v[i].empty()) ++cnt;
  27. }
  28. int ans = 0;
  29. for (int k = 1; k <= m; ++k) {
  30. for (int i = n; i >= 1; --i) {
  31. for (int j = i; j <= n; ++j) {
  32. dp[i][j] = max({dp[i][j], pos[a[k][i]][i], pos[a[k][j]][j],
  33. dp[i+1][j], dp[i][j-1]});
  34.  
  35. if (i < j) {
  36. dp[i][j] = max({dp[i][j], pos[a[k][i]][j], pos[a[k][j]][i]});
  37. if (a[k][i] == a[k][j]) dp[i][j] = k;
  38. }
  39.  
  40. ans = max(ans, (j - i + 1) * (k - dp[i][j]));
  41. }
  42. }
  43. for (int i = 1; i <= n; ++i)
  44. pos[a[k][i]][i] = k;
  45. }
  46.  
  47. cout << ans;
  48. }
  49. int main() {
  50. ios_base::sync_with_stdio(0);
  51. cin.tie(0); cout.tie(0);
  52. read();
  53. solve();
  54. return 0;
  55. }
  56.  
Success #stdin #stdout 0.01s 28324KB
stdin
Standard input is empty
stdout
Standard output is empty