这种题。。。也是醉了好吗。。。。
其实做完之后想起来也挺简单的。每次就枚举能够折叠的长度,看最后长度与要求的相等时是否一致。代码也是各种丑的说。。。
#include <stdio.h>
#include <string.h>
#define maxn 20
int b[20];
int flag;
int m;
int panduan(int a[20])
{
int i,j,k;
k=0;
for(i=1;i<=m;i++) if(a[i]!=b[i]) {k=1;break;}
if(k==0) return 1;
k=0;
for(i=1,j=m;i<=m;i++,j--) if(a[i]!=b[j]) {k=1;break;}
if(k==0) return 1;
return 0;
}
/*void find(int a[maxn],int len)
{
int i,j,k;
int que[maxn];
if(len<m) return;
// int len=r-l+1;
if(len==m)
{
// for(i=1;i<=len;i++) printf("**%d",a[i]); printf("\n");
if(panduan(a)) flag=1;return;
}
if(len>=2*m)
{
memset(que,0,sizeof(que));
int l,r;
l=len-m,r=len-m+1;
int st=0;
while(r<=len)
{
que[l]=a[l]+a[r];
l--;r++;
st++;
}
for(i=1;i<=len-2*m;i++)
que[i]=a[i];
// for(i=1;i<=st;i++) printf("**%d",que[i]);printf("\n");
find(que,st);
memset(que,0,sizeof(que));
l=m,r=m+1;
st=0;
int top=1;
while(l>0)
{
que[top++]=a[r]+a[l];
l--;r++;
st++;
}
for(i=2*m+1;i<=len;i++) que[i]=a[i];
// for(i=1;i<=st;i++) printf("**%d",que[i]);printf("\n");
find(que,st);
}
else
{
int l,r;
j=len-m;
k=m;
memset(que,0,sizeof(que));
if(k<j) {int tmp=k;k=j;j=tmp;}
// l=len-k,r=len-k+1;
l=k,r=k+1;
// printf("%d %d\n",j,k);
int st=0;
while(r<=len)
{
que[l]=a[l]+a[r];
l--;r++;
st++;
// printf("jjj\n");
}
// printf("%d %d %d\n",len,k,st);
for(i=1;i<=len-k;i++) que[i]=a[i];
// for(i=1;i<=len-2*k;i++) {que[i]=a[i];puts("??");}
// for(i=1;i<=st;i++) printf("***%d",que[i]);
find(que,st);
}
return ;
}*/
void find(int a[maxn],int len)
{
int i,j,k;
if(len<m) return;
if(len==m)
{
// for(i=1;i<=len;i++) printf("**%d",a[i]);printf("\n");
if(panduan(a)) flag=1;
return;
}
int s=len-m;
int que[maxn];
for(i=1;i+i<=len;i++)
{//printf("??\n");
int l=len-i;
int r=l+1;
int st=0;
while(r<=len)
{
que[l]=a[l]+a[r];
l--;r++;
st++;
}
for(j=1;j<=l;j++) {que[j]=a[j];st++;};
// for(j=1;j<=st;j++) printf("**%d",que[j]);printf("\n");
find(que,st);
l=i;r=l+1;
st=0;
int top=1;
while(l>0)
{
que[top++]=a[l]+a[r];
l--;r++;
st++;
}
for(j=2*i+1;j<=len;j++) {que[top++]=a[j];st++;}
// for(j=1;j<=st;j++) printf("**%d",que[j]);printf("\n");
find(que,st);
}
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
flag=0;
int i,j,k;
int a[20];
for(i=1;i<=n;i++) scanf("%d",&a[i]);
scanf("%d",&m);
for(i=1;i<=m;i++) scanf("%d",&b[i]);
find(a,n);
if(flag) printf("S\n");
else printf("N\n");
}
return 0;
}