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