제출 #1158718

#제출 시각아이디문제언어결과실행 시간메모리
1158718brover29Dango Maker (JOI18_dango_maker)C++17
13 / 100
47 ms71072 KiB
#include <bits/stdc++.h> //qwerty47924692 using namespace std; using ll = long long; const ll N=3005; const ll M=N*N/3; const string br="617283"; #define sz(a)(ll)a.size() #define f first #define s second ll dp[N][N]; char c[N][N]; ll n,m; struct dango{ vector<pair<ll,ll>>v; }; bool equ(dango a,dango b){ for(auto i:a.v){ for(auto j:b.v){ if(i==j)return 1; } } return 0; } vector<ll>g[M]; vector<ll>l; ll was[M],pr[M]; void dfs(ll v,ll k){ was[v]=1; k^=1; if(k==1)l.push_back(v); for(ll to:g[v]){ if(was[to])continue; dfs(to,k); } }ll try_kuhn(ll v){ if(was[v])return 0; was[v]=1; for(ll to:g[v]){ if(!pr[to]||try_kuhn(pr[to])){ pr[to]=v; return 1; } }return 0; } vector<dango>a; ll kuhn(){ ll ans=0; for(ll i:l){ for(ll j=1;j<=a.size();j++)was[j]=0; ans+=try_kuhn(i); } return ans; }ll ans=0,used[N][N]; void f(ll i,ll j,ll cnt=0){ if(i==n&&j==m){ ans=max(ans,cnt); return; }ll ni=i,nj=j; ni++; if(ni>n){ ni=1; nj++; } f(ni,nj,cnt); if(c[i][j]=='R'&&c[i+1][j]=='G'&&c[i+2][j]=='W'&&!used[i][j]&&!used[i+1][j]&&!used[i+2][j]){ used[i][j]=1; used[i+1][j]=1; used[i+2][j]=1; f(ni,nj,cnt+1); used[i][j]=0; used[i+1][j]=0; used[i+2][j]=0; } if(c[i][j]=='R'&&c[i][j+1]=='G'&&c[i][j+2]=='W'&&!used[i][j]&&!used[i][j+1]&&!used[i][j+2]){ used[i][j]=1; used[i][j+1]=1; used[i][j+2]=1; f(ni,nj,cnt+1); used[i][j]=0; used[i][j+1]=0; used[i][j+2]=0; } } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cin>>n>>m; for(ll i=1;i<=n;i++){ for(ll j=1;j<=m;j++){ cin>>c[i][j]; } }if(n<=4&&m<=4){ f(n,0); cout<<ans; return 0; }for(ll i=1;i<=n;i++){ for(ll j=1;j<=m;j++){ if(c[i][j]=='R'&&c[i][j+1]=='G'&&c[i][j+2]=='W'){ vector<pair<ll,ll>>v={make_pair(i,j),make_pair(i,j+1),make_pair(i,j+2)}; dango x; x.v=v; a.push_back(x); }if(c[i][j]=='R'&&c[i+1][j]=='G'&&c[i+2][j]=='W'){ vector<pair<ll,ll>>v; v={{i,j},{i+1,j},{i+2,j}}; dango x; x.v=v; a.push_back(x); } } } for(ll i=0;i<a.size();i++){ for(ll j=i+1;j<a.size();j++){ if(equ(a[i],a[j])){ g[i+1].push_back(j+1); g[j+1].push_back(i+1); } } }dfs(1,0); cout<<a.size()-kuhn(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...