cf-208B - Solitaire-记录状态DFS

2014-11-24 07:38:55 · 作者: · 浏览: 0

比赛的时候竟然没想起来记录状态,好搓啊。。。

int dp[n][i][j][k];长度为n,第n-2个的状态为i,第n-1个的状态为j,第n个的状态为k,能不能成功操作。

这样时间复杂度为(52*52*52*52);

#include
  
   
#include
   
     #include
    
      #include
     
       #include
      
        #include
       
         #define INF 1000000 using namespace std; char va[15]={'2','3','4','5','6','7','8','9','T','J','Q','K','A'}; char su[5]={'S','D','H','C'}; int dp[60][60][60][60]; int a[60]; int pan(int x,int y) { if(x%4==y%4)return 1; if(x/4==y/4)return 1; return 0; } int dfs(int ns,int x,int y,int z) { if(dp[ns][x][y][z]!=-1)return dp[ns][x][y][z]; if(ns<=3) { if(pan(x,z)&&pan(y,z)) { dp[ns][x][y][z]=1; } else dp[ns][x][y][z]=0; return dp[ns][x][y][z]; } int leap=0; if(pan(y,z)&& dfs(ns-1,a[ns-3],x,z))leap=1; if(pan(a[ns-3],z)&&dfs(ns-1,z ,x,y))leap=1; dp[ns][x][y][z]=leap; return leap; } int main() { int n,m,i,j,k; char str[11]; while(~scanf("%d",&n)) { memset(dp,-1,sizeof(dp)); for(i=1;i<=n;i++) { scanf("%s",str); for(j=0;j<13;j++) if(str[0]==va[j])a[i]=j; for(j=0;j<4;j++) if(str[1]==su[j])a[i]=a[i]*4+j; } if(n<3) { if(n==1)cout<<"YES"<