记忆化搜索(DFS+DP) URAL 1501 Sense of Beauty

 

题目传送门

 1 /*  2  题意:给了两堆牌,每次从首部取出一张牌,按颜色分配到两个新堆,分配过程两新堆的总数差不大于1  3  记忆化搜索(DFS+DP):我们思考如果我们将连续的两个操作看成一个集体操作,那么这个操作必然是1红1黑  4  考虑三种情况:a[]连续两个颜色相同,输出11;b[]连续两个相同,输出22;  5  a[x] != b[y], 输出12;否则Impossible  6  详细解释:http://blog.csdn.net/jsun_moon/article/details/10254417  7 */  8 #include <cstdio>  9 #include <iostream> 10 #include <algorithm> 11 #include <cstring> 12 #include <cmath> 13 #include <string> 14 using namespace std; 15 16 const int MAXN = 1e3 + 10; 17 const int INF = 0x3f3f3f3f; 18 char a[MAXN], b[MAXN]; 19 bool dp[MAXN][MAXN]; 20 21 bool DFS(int x, int y) 22 { 23 if (!x && !y) return true; 24 if (!dp[x][y]) dp[x][y] = true; 25 else return false; 26 27 if ((x-2)>=0 && a[x] != a[x-1] && DFS (x-2, y)) 28  { 29 printf ("11"); return true; 30  } 31 if ((y-2)>=0 && b[y] != b[y-1] && DFS (x, y-2)) 32  { 33 printf ("22"); return true; 34  } 35 if ((x-1)>=0 && (y-1)>=0 && a[x] != b[y] && DFS (x-1, y-1)) 36  { 37 printf ("12"); return true; 38  } 39 40 return false; 41 } 42 43 int main(void) //URAL 1501 Sense of Beauty 44 { 45 //freopen ("V.in", "r", stdin); 46 47 int n; 48 while (scanf ("%d", &n) == 1) 49  { 50 memset (dp, false, sizeof (dp)); 51 scanf ("%s", a+1); scanf ("%s", b+1); 52 53 if (!DFS (n, n)) puts ("Impossible"); 54 else puts (""); 55  } 56 57 return 0; 58 } 59 60 /* 61 Impossible 62 */

 

你可能感兴趣的:(DFS)