Newcoder 贝伦卡斯泰露(DFS)
题意:给n个元素组成的数组(n为偶数),问能否分成两个长度n/2的相同子序列.
思路:DFS,确立好参数,分两种情况:当前元素匹配(序列C中要与序列B匹配的数)则将该元素加入到C,继续DFS,若不匹配或相等仍选择不匹配,则将该元素加入到B中,继续DFS
#include<iostream>
using namespace std;
int a[41],b[41],c[41],t,n;
bool dfs(int i,int j,int id){//i,j分别表示b[],c[]中元素个数,id表示当前匹配元素下标
if(i>n/2||j>n/2) return 0;//结束条件
if(id>n) return 1;//结束条件
if(a[id]==b[j+1]){ //第一种情况加入到c[]
c[j+1]=a[id];
if(dfs(i,j+1,id+1)) return 1;//继续递归下一个
}
b[i+1]=a[id];//即使相等也加入b[]或者不相等加入到b[]
return dfs(i+1,j,id+1);//递归
}
int main(){
cin>>t;
while(t--){
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
b[1]=a[1];
puts(dfs(1,0,2)?"Frederica Bernkastel":"Furude Rika");
}
return 0;
}
PS:参考v5zsq