因为儿子需要,所以又更一篇水题题解.
很容易想到爆搜2^40复杂度直接搜,当然也可以合并分别处理2堆,但是我觉得这题剪枝完全不必要.所以一发爆搜+剪枝就过了.
剪枝就是必须保证前面的搜到的答案必要一致.emm没了
#include <bits/stdc++.h> using namespace std; const int N=45; int a[N]; int cka[N],ckb[N]; int n,flag; void dfs(int u,int dep1,int dep2) { if(u>n) return; if(flag) return; if(dep1!=1&&dep2!=1) { if(dep1<=dep2) { if(cka[dep1-1]!=ckb[dep1-1]) return; } else { if(cka[dep2-1]!=ckb[dep2-1]) return; } } if(dep1==n/2) { int flag1=1; for(int i=u,j=dep2;i<=n;i++,j++) { if(a[i]!=cka[j]) flag1=0; } if(flag1) flag=1; return; } cka[dep1]=a[u]; dfs(u+1,dep1+1,dep2); ckb[dep2]=a[u]; dfs(u+1,dep1,dep2+1); } int main() { int T; cin>>T; while(T--) { flag=0; cin>>n; for(int i=1;i<=n;i++) { cin>>a[i]; } dfs(1,0,0); if(flag) puts("Frederica Bernkastel"); else puts("Furude Rika"); } return 0; }