题目链接:传送门
题意:
把一个长度为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;
}