幸运三角形
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
3
-
描述
-
话说有这么一个图形,只有两种符号组成(‘+’或者‘-’),图形的最上层有n个符号,往下个数依次减一,形成倒置的金字塔形状,除第一层外(第一层为所有可能情况),每层形状都由上层决定,相邻的符号相同,则下层的符号为‘+’,反之,为‘-’;如下图所示(n = 3 时的两种情况):
如果图中的两种符号个数相同,那这个三角形就是幸运三角形,如上图中的图(2).
-
输入
-
有多组测试数据(少于20组)。
每行含一个整数n(0<n<20)。
输出
- 输出相应的幸运三角形个数。 样例输入
-
3 4
样例输出
-
4 6
-
有多组测试数据(少于20组)。
简单的DFS,不打表会超时的。。。
代码:
#include <cstdio>
#include <iostream>
#include <cstring>
const int M = 25;
using namespace std;
int map[M][M];
int n, ans;
int res[] = {0, 0, 0, 4, 6, 0, 0, 12, 40, 0, 0, 171, 410, 0, 0, 1896, 5160, 0, 0, 32757};
/*int judge(){
int i, q = n;
int sum1 = 0, sum2 = 0;
while(q){
if(map[q][1]) ++sum1;
else ++sum2;
for(i = 2; i <= q; i ++){
if(map[q][i]) ++sum1;
else ++sum2;
if(map[q][i]==map[q][i-1]) map[q-1][i-1] = 1;
else map[q-1][i-1] = 0;
}
q--;
}
if(sum1 == sum2) return 1;
else return 0;
}
void dfs(int cur){
if(cur > n){
if(judge()) ++ans;
return ;
}
map[n][cur] = 1;
dfs(cur+1);
map[n][cur] = 0;
dfs(cur+1);
}
void f(){
for(int i = 1; i < 20; i ++){
ans = 0;
n = i;
dfs(1);
res[i] = ans;
cout<<res[i]<<", ";
}
}*/
int main(){
// f();
int n;
while(cin>>n){
cout<<res[n]<<endl;
}
return 0;
}