Wannafly模拟赛3 贝伦卡斯泰露 【折半搜索+hash,状压dp】

来源:互联网 发布:真人快打x没有网络链接 编辑:程序博客网 时间:2024/06/08 16:57

题目:https://www.nowcoder.com/acm/contest/13/B
题意:
给出一个长度为n的数列Ai,问是否能将这个数列分解为两个长度
为n/2的子序列,满足
∙ 两个子序列不互相重叠。
∙ 两个子序列中的数要完全一样,{1, 2} = {1, 2},{1, 2} ≠ {2, 1}。

分析:
刚开始贪心,第2个序列尽量匹配最左边的数,后来想了想不对。
后来dfs爆搜,居然能过QAQ,可能数据不强吧。
有的是折半搜+hash:https://www.nowcoder.com/acm/contest/view-submission?submissionId=18952117
还有用队列正反走一遍的:https://www.nowcoder.com/acm/contest/view-submission?submissionId=18952929
状压:https://www.nowcoder.com/acm/contest/view-submission?submissionId=18948024

爆搜:

#include <iostream>#include <cstdio>#include <cstring>#include <set>#include <map>#include <vector>using namespace std;const int N=40+9;const int INF=0x3f3f3f3f;int n,flag;int q[N],a[N];void dfs(int id,int l1,int l2){    if(l1>n/2||l2>n/2||flag)return;    if(id==n){        if(l1==l2)flag=1;        return;    }    if(a[id]==q[l2])        dfs(id+1,l1,l2+1);    q[l1]=a[id];    dfs(id+1,l1+1,l2);}int main(){    int T;    scanf("%d",&T);    while(T--){        scanf("%d",&n);        memset(q,0,sizeof(q));        for(int i=0;i<n;i++)            scanf("%d",&a[i]);        q[0]=a[0];        flag=0;        dfs(1,1,0);        puts(flag?"Frederica Bernkastel":"Furude Rika");        }    return 0;}
原创粉丝点击