Advertisement
AlexAvram

Untitled

Apr 8th, 2025
365
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.77 KB | None | 0 0
  1. //submatrix #1441
  2. #include <iostream>
  3. #include <fstream>
  4. #include <cmath>
  5.  
  6. using namespace std;
  7. string fisier="submatrix";
  8. ifstream fin(fisier+".in");
  9. ofstream fout(fisier+".out");
  10.  
  11. int n, dp[1001][1001];
  12. bool mat[1001][1001];
  13. /*
  14. problema clasica
  15. //
  16. imi bordez initial matricea cu elementele
  17. de pe prima linia si prima coloana; verificarile
  18. pe aceste pozitii ar fi inutile;
  19. //
  20. pentru fiecare alt element, verific care este lungimea
  21. laturii celui mai mic patrat din care fac parte elementele din
  22. "spatele lui"; fie minimul dintre lungime laturilor  verifcatex,
  23. acest fapt ne garanteaza garanteaza pentru elementul curent
  24. o lungime x+1;
  25.      |element de verificat element de verificat|
  26.      |element de verificat    element curent   |
  27. //
  28. la final pe pozitia (i, j) a matricei dp[][] v-a fi memorata
  29. lungimea maxima a laturii patratului ce contine elemenutul (i, j),
  30. luand in calcul strict elementele din submatricea (0,0)-(i,j)
  31. //
  32. parcurg matricea si afisez cea mai mare valoare gasita;
  33. */
  34. void citire()
  35. {
  36.     fin>>n;
  37.     for (int i=1; i<=n; ++i)
  38.         for (int j=1; j<=n; ++j)
  39.             fin>>mat[i][j];
  40. }
  41. void construire_margini()
  42. {
  43.     for (int i=1; i<=n; ++i)
  44.     {
  45.         dp[i][1]=mat[i][1];
  46.         dp[1][i]=mat[1][i];
  47.     }
  48. }
  49. void rezolvare()
  50. {
  51.     construire_margini();
  52.     int rezultat=0;
  53.     for (int i=2; i<=n; ++i)
  54.     {
  55.         for (int j=2; j<=n; ++j)
  56.         {
  57.             if (mat[i][j])
  58.             {
  59.                 dp[i][j]=min(dp[i-1][j], min(dp[i-1][j-1], dp[i][j-1]))+1;
  60.                 if (dp[i][j]>rezultat)
  61.                     rezultat=dp[i][j];
  62.             }
  63.             else
  64.                 dp[i][j]=0;
  65.         }
  66.     }
  67.     fout<<rezultat<<'\n';
  68. }
  69. int main()
  70. {
  71.     citire();
  72.     rezolvare();
  73.     return 0;
  74. }
  75.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement