hdu 2510 符号三角形 (DFS+打表)
符号三角形
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 811 Accepted Submission(s): 403
Problem Description
符号三角形的 第1行有n个由“+”和”-“组成的符号 ,以后每行符号比上行少1个,2个同号下面是”+“,2个异 号下面是”-“ 。计算有多少个不同的符号三角形,使其所含”+“ 和”-“ 的个数相同 。 n=7时的1个符号三角形如下:
+ + - + - + +
+ - - - - +
- + + + -
- + + -
- + -
- -
+
+ + - + - + +
+ - - - - +
- + + + -
- + + -
- + -
- -
+
Input
每行1个正整数n <=24,n=0退出.
Output
n和符号三角形的个数.
Sample Input
15
16
19
20
0
Sample Output
15 1896
16 5160
19 32757
20 59984
Source
Recommend
这题还比较好吧,开始写了代码发现一定会超时,后来看了别人的解法再想想,可以打表解决,小菜的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; } /* */
求得解后打表
1 #include<stdio.h> 2 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}; 3 int main(void) 4 { 5 int n; 6 while(scanf("%d",&n),n) 7 { 8 printf("%d %d\n",n,ans[n]); 9 } 10 return 0; 11 }