YEZAELP

SMMR-158: Quick Maths

Jun 8th, 2020
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.28 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const long long INF=2e18;
  4. using pii=pair<int,int>;
  5. long long dp_min[600][600],dp_max[600][600];
  6. int main(){
  7.  
  8.     int n,c=2;
  9.     scanf("%d\n",&n);
  10.     int ar[n+1],symbol[n+1];
  11.     scanf("%d",&ar[1]);
  12.     for(int i=2;i<=n;i++){
  13.         char a;
  14.         int x;
  15.         scanf(" %c %d",&a,&x);
  16.         if(a=='-') symbol[i]=-1;
  17.         else symbol[i]=1;
  18.         ar[i]=x;
  19.  
  20.     }
  21.     for(int i=n;i>=1;i--){
  22.         for(int j=1;j<=n;j++){
  23.             dp_min[i][j] = INF;
  24.             dp_max[i][j] = -INF;
  25.             if(i==j) {
  26.                 dp_min[i][j]=ar[i];
  27.                 dp_max[i][j]=ar[i];
  28.                 continue;
  29.             }
  30.             for(int k=i;k<j;k++){
  31.                 if(symbol[k+1] == -1) {
  32.                     dp_min[i][j] = min( dp_min[i][j] , dp_min[i][k] - dp_max[k+1][j]  );
  33.                     dp_max[i][j] = max( dp_max[i][j] , dp_max[i][k] - dp_min[k+1][j] );
  34.                 }
  35.                 else {
  36.                     dp_min[i][j] = min( dp_min[i][j] , dp_min[i][k] + dp_min[k+1][j] );
  37.                     dp_max[i][j] = max( dp_max[i][j] , dp_max[i][k] + dp_max[k+1][j] );
  38.                 }
  39.  
  40.             }
  41.         }
  42.     }
  43.  
  44.     printf("%lld %lld",dp_min[1][n],dp_max[1][n]);
  45.  
  46.  
  47.     return 0;
  48. }
Add Comment
Please, Sign In to add comment