标签:
题目链接:传送门
题意:
把一个长度为n的序列分成个完全相同的子序列且不能有交叉。
分析:
对于一个数我们首先将其放在va[]数组里,如果接下来要讨论的一个数与va里的第一个数相同的话
那么这个数就可能是第二个序列的第一个数。
那么就有这样的几种情况:
1) 这个数是v1中间的一个数,直接放入v1.
2) 这个数v1的第一个数放在v2中,
代码如下:
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #include <cstring> #include <queue> using namespace std; const int maxn = 50; bool flag; int a[maxn]; int n; int q1[maxn],q2[maxn]; void dfs(int id,int len1,int len2,int st){ if(len1>n/2||len2>n/2||flag) return; if(id==n){ if(len1==len2) flag=1; return; } if(id==0){ q1[len1]=a[id]; dfs(id+1,len1+1,len2,st); } else{ if(a[id]==q1[st]){ q2[len2]=a[id]; dfs(id+1,len1,len2+1,st+1); } q1[len1]=a[id]; dfs(id+1,len1+1,len2,st); } } int main(){ int t; scanf("%d",&t); while(t--){ scanf("%d",&n); for(int i=0;i<n;i++){ scanf("%d",a+i); } memset(q1,0,sizeof(q1)); memset(q2,0,sizeof(q2)); flag=0; dfs(0,0,0,0); if(flag) puts("Good job!!"); else puts("What a pity!"); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/bigbigship/article/details/46802921