3376 符号三角形
时间限制: 1 s
空间限制: 128000 KB
题目等级 : 黄金 Gold
题目描述 Description
如下图是由14个“+”和14个“-”组成的符号三角形, 2个同号下面都是“+”,2个异号下面都是“-”
– + + – + + +
– + – – + +
– – + – +
+ – – –
– + +
– +
–
输入描述 Input Description
一个数n,表示符号三角形的第一行有n个符号
输出描述 Output Description
对于给定的n,计算有多少个不同的符号三角形,使其所含的“+”和“-”的个数相同严禁打表!!!!!)
若不存在方案,输出-1
样例输入 Sample Input
4
样例输出 Sample Output
6
数据范围及提示 Data Size & Hint
对于90%的数据,n<=24;
对于另外10%的数据,请注意特殊情况。
分类标签 Tags 点此展开
思路:写了个搜索,发现只能卡到70分,然后就用这个暴力打了个表,然后就过了。
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define MAXN 2500 using namespace std; int n,sum,ans; int map[MAXN][MAXN]; int judgenum){ int bns=0,k; forint i=2;i<=n;i++){ forint j=1;j<=n-i+1;j++){ ifmap[i-1][j]!=map[i-1][j+1]) map[i][j]=0,bns++; else ifmap[i-1][j]==map[i-1][j+1]) map[i][j]=1; } } forint i=1;i<=n;i++) ifmap[1][i]==0) bns++; ifbns==sum-bns) return 1; else return 0; } void dfsint now,int num1,int num2){ ifnow==n+1){ ifjudgenum)) ans++; return ; } map[1][now]=1;dfsnow+1,num1+1,num2);map[1][now]=-1; map[1][now]=0;dfsnow+1,num1,num2+1);map[1][now]=-1; } int main){ scanf"%d",&n); forint i=1;i<=n;i++) sum+=i; ifsum%2!=0){ cout<<"-1";return 0; } memsetmap,-1,sizeofmap)); dfs1,0,0); cout<<ans; } /* - + + - + + + - + - - + + - - + - + + - - - - + + - + - */
70分暴力
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define MAXN 2500 using namespace std; int n,sum,ans; int map[MAXN][MAXN]; int anss[25]={0,-1,-1,4,6,-1,-1,12,40,-1,-1,171,410,-1,-1,1896,5160,-1,-1,32757,59984,-1,-1,431095,822229}; int judgenum){ int bns=0,k; forint i=2;i<=n;i++){ forint j=1;j<=n-i+1;j++){ ifmap[i-1][j]!=map[i-1][j+1]) map[i][j]=0,bns++; else ifmap[i-1][j]==map[i-1][j+1]) map[i][j]=1; } } forint i=1;i<=n;i++) ifmap[1][i]==0) bns++; ifbns==sum-bns) return 1; else return 0; } void dfsint now){ ifnow==n+1){ ifjudgenum)) ans++; return ; } map[1][now]=1;dfsnow+1);map[1][now]=-1; map[1][now]=0;dfsnow+1);map[1][now]=-1; } int main){ scanf"%d",&n); forint i=1;i<=n;i++) sum+=i; ifsum%2!=0){ cout<<"-1";return 0; } cout<<anss[n]; /*forn=1;n<=24;n++){ memsetmap,-1,sizeofmap)); dfs1);ifans==0){ cout<<"-1,";sum=0;continue; } cout<<ans<<","; ans=0;sum=0; }*/ } /* - + + - + + + - + - - + + - - + - + + - - - - + + - + - */
细雨斜风作晓寒。淡烟疏柳媚晴滩。入淮清洛渐漫漫。
雪沫乳花浮午盏,蓼茸蒿笋试春盘。人间有味是清欢。