当前位置: 代码迷 >> 综合 >> hdu - 4665 - Unshuffle
  详细解决方案

hdu - 4665 - Unshuffle

热度:94   发布时间:2024-01-10 13:26:33.0

题意:给出一个长度为n平方串(由2个相同序列相互插入(但不改变同一序列的相对顺序)而成),输出串中的元素归属于第几个原串(组成平方串的串)(n <= 2000)。

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4665

——>>dfs(int cur, int last, int R),cur为目前已搜索到的对数,last为搜索到的第一个序列的上一个元素的位置,R为搜索到的第二个序列的上一个元素的位置。

#include <cstdio>
#include <cstring>using namespace std;const int maxn = 2000 + 10;
int n, a[maxn], ret[maxn];void read(){scanf("%d", &n);for(int i = 0; i < n; i++) scanf("%d", &a[i]);
}bool dfs(int cur, int last, int R){if(cur == n / 2) return 1;int i, j;for(i = last; i < n && ret[i] != -1; i++);ret[i] = 0;for(j = i+1; j < n; j++) if(ret[j] == -1 && a[j] == a[i] && j > R){ret[j] = 1;if(dfs(cur + 1, i + 1, j)) return 1;ret[j] = -1;}ret[i] = -1;        //要修改回去,若不修改,会影响上一层dfsreturn 0;       //发现i这个第1个没修改过的位置,因为它必须赋值且赋为0,而递归后发现其矛盾的话,这是无解的
}void solve(){memset(ret, -1, sizeof(ret));dfs(0, 0, 0);for(int i = 0; i < n; i++) printf("%d", ret[i]);printf("\n");
}int main()
{int T;scanf("%d", &T);while(T--){read();solve();}return 0;
}