Submission #236168

#TimeUsernameProblemLanguageResultExecution timeMemory
236168topovikRetro (COCI17_retro)C++14
70 / 100
371 ms251128 KiB
#include <bits/stdc++.h> using namespace std; #define PB push_back #define f first #define s second const int N = 300; pair<int,string> dp1[100][100][100]; string a[N]; int dp[300][300][301]; int pred[300][300][301]; int n,m; int pos=0; void Case1() { for (int i=0; i<n; i++) for (int j=0; j<m; j++) for (int c=0; c<300; c++) dp[i][j][c]=-1e9; dp[0][pos][0]=0; for (int i=0; i<n-1; i++) { for (int j=0; j<m; j++) if (a[i][j]!='*') for (int c=0; c<300; c++) { for (int c1=-1; c1<=1; c1++) { int j1=j+c1; if (j1>-1 && j1<m) { if ((a[i+1][j1]!='(' && a[i+1][j1]!=')') && dp[i+1][j1][c]<dp[i][j][c]) dp[i+1][j1][c]=dp[i][j][c],pred[i+1][j1][c]=-c1; if (a[i+1][j1]=='(' && dp[i+1][j1][c+1]<dp[i][j][c]+1) dp[i+1][j1][c+1]=dp[i][j][c]+1,pred[i+1][j1][c+1]=-c1; if (a[i+1][j1]==')' && c>0 && dp[i+1][j1][c-1]<dp[i][j][c]+1) dp[i+1][j1][c-1]=dp[i][j][c]+1,pred[i+1][j1][c-1]=-c1; } } } } int mx=0,x=0,y=0; for (int i=0; i<n; i++) for (int j=0; j<m; j++) if (a[i][j]=='*' || i==n-1) if (dp[i][j][0]>mx) mx=max(mx,dp[i][j][0]),x=i,y=j; cout<<mx<<endl; string s; int bal=0; while (x>0) { int upd=0; if (a[x][y]=='(' || a[x][y]==')') { s+=a[x][y]; if (a[x][y]=='(') upd--; else upd++; } y+=pred[x][y][bal]; bal+=upd; x--; } reverse(s.begin(),s.end()); cout<<s; } void Case2() { for (int i=0; i<n; i++) for (int j=0; j<m; j++) for (int c=0; c<100; c++) dp1[i][j][c]={1e9,""}; dp1[0][pos][0]={0,""}; for (int i=0; i<n-1; i++) { for (int j=0; j<m; j++) if (a[i][j]!='*') for (int c=0; c<100; c++) { for (int c1=-1; c1<=1; c1++) { int j1=j+c1; if (j1>-1 && j1<m) { if (a[i+1][j1]!='(' && a[i+1][j1]!=')') dp1[i+1][j1][c]=min(dp1[i+1][j1][c],dp1[i][j][c]); if (a[i+1][j1]=='(' ) dp1[i+1][j1][c+1]=min(dp1[i+1][j1][c+1],{dp1[i][j][c].f-1,dp1[i][j][c].s+"("}); if (a[i+1][j1]==')' && c>0) dp1[i+1][j1][c-1]=min(dp1[i+1][j1][c-1],{dp1[i][j][c].f-1,dp1[i][j][c].s+")"}); } } } } pair<int,string> mx={0,""}; for (int i=0; i<n; i++) for (int j=0; j<m; j++) if (a[i][j]=='*' || i==n-1) mx=min(mx,dp1[i][j][0]); cout<<-mx.f<<"\n"<<mx.s; } int main() { cin>>n>>m; for (int i=0; i<n; i++) cin>>a[i]; reverse(a,a+n); for (int j=0; j<m; j++) if (a[0][j]=='M') pos=j; if (n>100) Case1(); else Case2(); }
#Verdict Execution timeMemoryGrader output
Fetching results...