zoukankan      html  css  js  c++  java
  • 符号三角形问题

    符号三角问题+”和-”组成的符号三角形。2个同号下面都是“+”,2个异号下面都是“-”。

    在一般情况下,符号三角形的第一行有n个符号。符号三角形问题要求对于给定的n,计算有多少个不同的符号三角形,使其所含的“+”和“-”的个数相同。

    import java.io.*;
    import java.util.*;
     
    public class Triangles
    {
           public static int n,half,count;//第一行的符号个数n,当前“+”个数count,
           public static int[][] p;//符号三角形矩阵
           public static long sum;//符合条件的符号三角形个数
     
           public static long computs(int nn){
                  n=nn;
                  count=0;
                  sum=0;
                  half=n*(n+1)/2;
                  if (half%2==1)//无解的判断:n*(n+1)/2为奇数
                  {
                         return 0;
                  }
                  half=half/2;
     
                  p=new int[n+1][n+1];
                  for (int i=0;i<n ;i++ )//数组初值
                  {
                         for (int j=0;j<n ;j++ )
                         {
                                p[i][j]=0;
                         }
                  }
                  backtrack(1);
                  return sum;
           }
     
           public static void backtrack(int t){
                  if ((count>half)||(t*(t-1)/2-count>half))return;//若符号统计未超过半数,并且另一种符号也未超过半数
                  if (t>n)//当i>n时,算法搜索至叶节点,得到一个新的“+”个数与“—”个数相同的符号三角形,当前已找到的符号三角形数sum增1.
                  {
                         sum++;
                  }else{
                         for(int i=0;i<2;i++){
                            p[1][t]=i;
                            count+=i;
                            for(int j=2;j<=t;j++){
                              if(p[j-1][t-j+1]==p[j-1][t-j+2])p[j][t-j+1]=1;//2个同号下面都是“+”    
                              else p[j][t-j+1]=0;//2个异号下面都是“-”
                              count+=p[j][t-j+1];
                            }
                            backtrack(t+1);
                            for(int j=2;j<=t;j++)//回溯时取消上一次的赋值
                              count-=p[j][t-j+1];
                            count-=i;
                         }
                  }
           }
     
     
           public static void main(String[] args) 
           {
                  System.out.println("请输入第一行符号值:");
                  Scanner read =new Scanner(System.in);
                  int n=read.nextInt();
                  System.out.println("个数:"+computs(n));
           }
    }

  • 相关阅读:
    BZOJ 1191 HNOI2006 超级英雄hero
    BZOJ 2442 Usaco2011 Open 修建草坪
    BZOJ 1812 IOI 2005 riv
    OJ 1159 holiday
    BZOJ 1491 NOI 2007 社交网络
    NOIP2014 D1 T3
    BZOJ 2423 HAOI 2010 最长公共子序列
    LCA模板
    NOIP 2015 D1T2信息传递
    数据结构
  • 原文地址:https://www.cnblogs.com/ljs-666/p/7923250.html
Copyright © 2011-2022 走看看