Alex_tz307

Cherchez vol 2 - Suma - pag 194(ONI 2005) - 70 puncte(corect)

Sep 24th, 2020
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.40 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. // http://campion.edu.ro/arhiva/index.php?page=problem&action=view&id=683
  3.  
  4. using namespace std;
  5.  
  6. ifstream fin("suma2.in");
  7. ofstream fout("suma2.out");
  8.  
  9. inline void max_self(int& a, int b) {
  10.     a = max(a, b);
  11. }
  12.  
  13. int main() {
  14.     int N;
  15.     fin >> N;
  16.     int M = N;
  17.     vector < int > a;
  18.     a.push_back(0);
  19.     while(N--) {
  20.         string s;
  21.         fin >> s;
  22.         for(int i = 0; i < (int)s.size(); ++i)
  23.             a.push_back(s[i] - '0');
  24.     }
  25.     N = a.size() - 1;
  26.     vector < vector < int > > dp(N + 1, vector < int >(M + 1, -1));
  27.     dp[0][0] = 0;
  28.     dp[1][1] = a[1];
  29.     dp[2][1] = a[1] * 10 + a[2];
  30.     if(a[2])
  31.         dp[2][2] = a[1] + a[2];
  32.     dp[3][1] = a[1] * 100 + a[2] * 10 + a[3];
  33.     if(a[3])
  34.          max_self(dp[3][2], a[1] * 10 + a[2] + a[3]);
  35.     if(a[2] && a[3])
  36.         dp[3][3] = a[1] + a[2] + a[3];
  37.     for(int i = 4; i <= N; ++i) {
  38.         int DIM = min(i, M);
  39.         for(int j = 2; j <= DIM; ++j) {
  40.             if(a[i] > 0 && dp[i - 1][j - 1] != -1)
  41.                 max_self(dp[i][j], dp[i - 1][j - 1] + a[i]);
  42.             if(a[i - 1] > 0 && dp[i - 2][j - 1] != -1)
  43.                 max_self(dp[i][j], dp[i - 2][j - 1] + a[i - 1] * 10 + a[i]);
  44.             if(a[i - 2] > 0 && dp[i - 3][j - 1] != -1)
  45.                 max_self(dp[i][j], dp[i - 3][j - 1] + a[i - 2] * 100 + a[i - 1] * 10 + a[i]);
  46.         }
  47.     }
  48.     fout << dp[N][M];
  49. }
Add Comment
Please, Sign In to add comment