http://codeforces.com/contest/355/problem/Dios
這道題問了一下學妹,難道說哥已經老了!!!spa
首先題意理解上有些問題 好比說code
a b cblog
b d eci
f g h字符串
第一我的寫下 a ,第二我的寫下 b,而後又該第一我的寫了,這時候的 b 既能夠是上邊的 bget
也能夠是下邊的 b 由將要寫的人決定string
dp[n][1<<20] 中dp[x][y] 表示的意思是到第x步時,選y這個狀態爲結尾(所對應的字符都相等)it
且前面的字符串都同樣時,接下來怎麼選出的最優解io
代碼:
#include<iostream> #include<stack> #include<cstdio> #include<queue> #include<cstring> #include<algorithm> #include<vector> #include<set> #include<map> #include<string> #include<cmath> using namespace std; typedef long long ll; typedef pair<int,int> pp; const double eps=1e-6; const int INF=0x3f3f3f3f; const int N=41; int dp[N][1<<20]; char c[N][N]; int a[N][N]; int n; int dfs(int x,int y) { if(dp[x][y]!=INF) return dp[x][y]; int w=(y|(y<<1)); int s[26]={0}; for(int h=0,x1=x,y1=1;h<n;++h,x1--,y1++) if((y&(1<<h))&&x1>=1&&y1<=n) {dp[x][y]=a[x1][y1];break;} if(x==2*n-1) return dp[x][y]; for(int h=0,x1=x+1,y1=1;h<n;++h,x1--,y1++) if((w&(1<<h))&&x1>=1&&y1<=n) { int t=c[x1][y1]-'a'; s[t]=(s[t]|(1<<h)); } int k0=-INF,k1=INF; for(int i=0;i<26;++i) if(s[i]>0) { k0=max(k0,dfs(x+1,s[i])); k1=min(k1,dfs(x+1,s[i])); } if((x&1)) dp[x][y]+=k1; else dp[x][y]+=k0; return dp[x][y]; } int main() { //freopen("data.in","r",stdin); while(cin>>n) { int m=(1<<n); for(int i=0;i<N;++i) for(int j=0;j<m;++j) dp[i][j]=INF; memset(c,0,sizeof(c)); memset(a,0,sizeof(a)); for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) { cin>>c[i][j]; if(c[i][j]=='a') a[i][j]=1; if(c[i][j]=='b') a[i][j]=-1; } int k=dfs(1,1); //cout<<k<<endl; if(k>0) cout<<"FIRST"<<endl; if(k<0) cout<<"SECOND"<<endl; if(k==0) cout<<"DRAW"<<endl; } //fclose(stdin); return 0; }