您的位置:首页 > 其它

hdu 2510 符号三角形 (DFS+打表)

2014-03-17 20:06 309 查看

符号三角形

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 811 Accepted Submission(s): 403


[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

[align=left]Source[/align]
ECJTU 2008 Autumn Contest

[align=left]Recommend[/align]
lcy | We have carefully selected several similar problems for you: 2512 2515 2509 2517 2514

这题还比较好吧,开始写了代码发现一定会超时,后来看了别人的解法再想想,可以打表解决,小菜的dfs一般,解24时要好几分钟...

还有题目加减号的情况和异或一样,于是用01表示方便计算。

#include<stdio.h>
#include<string.h>
int n,cnt,m;
int c[50];
int judge(int c0[])
{
int cc=0;
int s[50];
for(int i=0;i<n;i++){
s[i]=c0[i];
if(c0[i]) cc++;
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++) s[j]=c0[j];
for(int j=0;j<n-i-1;j++)
if(c0[j]=s[j]^s[j+1]) cc++;
}
if(cc==m) return 1;
return 0;
}
void dfs(int id)
{
if(id==n){
cnt+=judge(c);return;
}
c[id]=0;
dfs(id+1);
c[id]=1;
dfs(id+1);
return;
}
int main(void)
{
//freopen("C:\\Users\\Administrator\\Desktop\\in.txt","r",stdin);
//freopen("C:\\Users\\Administrator\\Desktop\\out.txt","w",stdout);
while(scanf("%d",&n)!=EOF)
{
memset(c,0,sizeof(c));
m=(n+1)*n/2;
if(m%2){ //小剪枝
printf("%d %d\n",n,0);
continue;
}
m/=2;
cnt=0;
dfs(0);
printf("%d %d\n",n,cnt);
}
return 0;
}
/*

*/


求得解后打表

#include<stdio.h>
int ans[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 main(void)
{
int n;
while(scanf("%d",&n),n)
{
printf("%d %d\n",n,ans
);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: