• NYOJ 491 幸运三角形


    幸运三角形

    时间限制:1000 ms  |  内存限制:65535 KB
    难度:3
     
    描述

            话说有这么一个图形,只有两种符号组成(‘+’或者‘-’),图形的最上层有n个符号,往下个数依次减一,形成倒置的金字塔形状,除第一层外(第一层为所有可能情况),每层形状都由上层决定,相邻的符号相同,则下层的符号为‘+’,反之,为‘-’;如下图所示(n = 3 时的两种情况):

                                      

    如果图中的两种符号个数相同,那这个三角形就是幸运三角形,如上图

    中的图(2).

             

     
    输入
    有多组测试数据(少于20组)。
    每行含一个整数n(0<n<20)。
    输出
    输出相应的幸运三角形个数。
    样例输入
    3
    4
    
    样例输出
    4
    6
    
    来源
    原创
    上传者
    ACM_杨延玺


    解题思路:我是用最笨的方法啦!打表。把题目中倒着的三角形顺着看。当前位置的放置只跟当前位置的左边的和上边的左边的决定,因此只要枚举每一层最左边的符号就可以了。

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <cstdlib>
     5 #include <vector>
     6 #include <climits>
     7 #include <algorithm>
     8 #include <cmath>
     9 #define LL long long
    10 using namespace std;
    11 bool tri[21][21];
    12 int ans[21],cnt = 0;
    13 void dfs(int n) {
    14     if(n > 20) return;
    15     for(int k = 0; k < 2; k++) {
    16         tri[n][0] = k;
    17         cnt += tri[n][0];
    18         for(int i = 1; i < n; i++) {
    19             tri[n][i] = tri[n-1][i-1]?tri[n][i-1]:!tri[n][i-1];
    20             cnt += tri[n][i];
    21         }
    22         if((cnt<<1) == (n*(n+1)>>1)) ans[n]++;
    23         dfs(n+1);
    24         for(int i = 0; i < n; i++)
    25             cnt -= tri[n][i];
    26     }
    27 }
    28 int main() {
    29     int n;
    30     dfs(1);
    31     while(~scanf("%d",&n)) printf("%d
    ",ans[n]);
    32     return 0;
    33 }
    View Code
  • 相关阅读:
    python的os模块命令
    python的os模块
    albert1017 Linux下压缩某个文件夹(文件夹打包)
    装饰器加不加()
    json和jsonp解决跨域传输数据等
    wsgi
    flask建立数据模型数据类型
    爬虫中
    javaweb学习总结(四)——Http协议
    JavaWeb学习总结(三)——Tomcat服务器学习和使用(二)
  • 原文地址:https://www.cnblogs.com/crackpotisback/p/3838419.html
Copyright © 2020-2023  润新知