D. Game with Strings

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;
}
相關文章
相關標籤/搜索