51nod 1400 序列分解(DFS + 剪枝)

原创 2015年07月08日 14:19:08

题目链接:传送门

题意:

把一个长度为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;
}


 

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

51nod 1400 序列分解 阻止我的只有读题能力了

1400 序列分解 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题  收藏  关注 小刀和大刀是双胞胎兄弟。...

51Nod-1400-序列分解

ACM模版描述题解这道题题面上有一个陷阱,这里的子序列插在一起要能组成原序列,也就是说对顺序有一定要求,不能随便乱取。所以可以用dfs解决,但是如果不剪枝的话有可能会超时。代码#include #i...
  • f_zyj
  • f_zyj
  • 2016年09月15日 22:41
  • 263

51nod 1400 序列分解【Dfs+剪枝】好题~

1400 序列分解 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 小刀和大刀是双胞胎兄弟。今天他们玩一个有意思的游戏。 大...

51nod-序列分解(dfs)

1400 序列分解 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题  收藏  关注 小刀和大刀是双胞胎兄弟。...

51nod 1060 最复杂的数 数学&dfs剪枝

题意: 给你一个数n,求1到n中因子最多的那个数,如果有多个这样因子相同的数,取数字最小的那个。 做法: 这个题首先要有前置技能,反素数。 我们通过打表每个数的因子个数可以发现: 数因子的数...
  • Na_OH
  • Na_OH
  • 2017年07月23日 10:11
  • 98

51nod 算法马拉松3 A:序列分解

序列分解 System Message (命题人) 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 小刀和大刀是双胞胎兄弟。今天他们玩一个有意思的游戏。 大...

51nod 1109 01 组成N倍数 bfs+同余剪枝

原文链接:http://m.blog.csdn.net/article/details?id=53422304 给定一个自然数N,找出一个M,使得M > 0且M是N的倍数,并且M的10进制表示只...
  • Na_OH
  • Na_OH
  • 2017年03月18日 20:16
  • 219

51nod 1109 01组成的N的倍数【Bfs+同余定理剪枝】好题!

1109 01组成的N的倍数 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 给定一个自然数N,找出一个M,使得M > 0且M是N的倍数,并且M的...

51nod树的距离之和 DFS+递推

题目: 给定一棵无根树,假设它有n个节点,节点编号从1到n, 求任意两点之间的距离(最短路径)之和。 Input 第一行包含一个正整数n (n ...

51nod 1489 蜥蜴和地下室(DFS)

哈利喜欢玩角色扮演的电脑游戏《蜥蜴和地下室》。此时,他正在扮演一个魔术师。在最后一关,他必须和一排的弓箭手战斗。他唯一能消灭他们的办法是一个火球咒语。如果哈利用他的火球咒语攻击第i个弓箭手(他们从左到...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:51nod 1400 序列分解(DFS + 剪枝)
举报原因:
原因补充:

(最多只允许输入30个字)