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;
}