您的位置:首页 > 其它

HDOJ 2510 符号三角形

2015-11-12 13:18 225 查看


符号三角形

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 1238    Accepted Submission(s): 656


[align=left]Problem Description[/align]
符号三角形的 第1行有n个由“+”和”-“组成的符号 ,以后每行符号比上行少1个,2个同号下面是”+“,2个异 号下面是”-“ 。计算有多少个不同的符号三角形,使其所含”+“ 和”-“ 的个数相同 。 n=7时的1个符号三角形如下:

+ + - + - + +

+ - - - - +

- + + + -

- + + -

- + -

- -

+

 

[align=left]Input[/align]
每行1个正整数n <=24,n=0退出.

 

[align=left]Output[/align]
n和符号三角形的个数.

 

[align=left]Sample Input[/align]

15
16
19
20
0

 

[align=left]Sample Output[/align]

15 1896
16 5160
19 32757
20 59984

 

看了大神的思路,可以把“-”看成1,“+”看成0;所以根据异或运算1^1=0;1^0=1;0^0=0。把0,1取代符号。

暴力dfs,然而超时,不过思路很好,代码如下:

#include<cstdio>
#include<cstring>
int a[25][25],ans[25];

void dfs(int n)
{
int i,j,cnt=0;
if(n>24)
return ;
for(i=0;i<=1;++i)
{
a[1]
=i;
cnt+=i;
for(j=2;j<=n;++j)
{
a[j][n-j+1]=a[j-1][n-j+1]^a[j-1][n-j+2];
cnt+=a[j][n-j+1];
}
if(cnt*2==n*(n+1)/2)
ans
++;
dfs(n+1);
cnt-=i;
for(j=2;j<=n;++j)
{
a[j][n-j+1]=a[j-1][n-j+1]^a[j-1][n-j+2];
cnt-=a[j][n-j+1];
}
}
}

int main()
{
int n;
memset(ans,0,sizeof(ans));
dfs(1);
while(scanf("%d",&n)&&n)
printf("%d %d\n",n,ans
);
return 0;
}


最后还是无耻地用打表过了这题:

#include<cstdio>
int main()
{
int a[25]={0,0,0,4,6,0,0,12,40,0,0,171,410,0,0,1896,5160,0,0,32757,59984,0,0,431095,822229};
int n;
while(scanf("%d",&n)&&n)
printf("%d %d\n",n,a
);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: