codeforces 849A A.Odds and Ends

来源:互联网 发布:淘宝店买什么好 编辑:程序博客网 时间:2024/05/23 19:15

http://codeforces.com/problemset/problem/849/A

题意:给你一个序列,然后让你判断这个序列能不能分成这样奇数个的子序列,这些子序列满足以奇数为起点,以奇数为终点,如果能分成这样的序列输出Yes,否则输出No。

思路:xjb搜就行了,先打一个奇数长度的奇数表,暴力dfs,判断在所有的情况下,有没有一种情况满足条件,如果有就‘Yes’,否则‘NO’.

#include <iostream>

#include <cstdio>

#include <string>

#define maxn 110

using namespace std;

bool flag;

int n;

int a[maxn],odd[maxn];

void dfs(int s,int left,int len,int cnt)  //left剩余的长度,len当前枚举的长度

{

    if(!left)return;

    //printf("%d%d %d %d\n",s,left,len,cnt);

    if(left&1)

    {

       if((a[s]&1)&&(a[n]&1))

       {

           if((cnt+1)&1)

           {

                flag=true;

                //printf("cnt+1=%d\n",cnt+1);

           }

       }

       return;

    }

    if(flag)return;

    for(int i=1;i<=50;i++)

    {

       if(s+odd[i]>n||a[s]%2==0||a[s+odd[i]-1]%2==0)continue;

       dfs(s+odd[i],left-odd[i],odd[i],cnt+1);

    }

}

int main()

{

    for(int i=1;i<=50;i++)

       odd[i]=2*i-1;

    while(scanf("%d",&n)!=EOF)

    {

       flag=false;

       for(int i=1;i<=n;i++)

           scanf("%d",&a[i]);

       dfs(1,n,n,0);

       if(flag)

           printf("Yes\n");

       else printf("No\n");

    }

    return 0;

}