POJ 3187 杨辉三角+枚举排列 好题

如果给出一个由1~n组成的序列,我们可以每相邻2个数求和,得到一个新的序列,不断重复,最后得到一个数sum,

现在输入n,sum,要求输出一个这样的排列,如果有多种情况,输出字典序最小的那一个。

刚开始我是直接搜,tle了

然后就开始找最初的序列和最终的和有什么关系

因为最终的和sum一定是等于若干个a[1],若干个a[2],...,若干个a[n]的和

即sum=p1*a1+p2*a2+...+pn*an

所以我们只要求出数组a的系数,n个p即可。

然后发现,和杨辉三角有很大的关系。

如果杨辉三角的行数从1开始算的话,

对于某一个1~n的排列得到sum,就需要有n个系数p,发现,这n个系数就刚好是杨辉三角的第n行。

所以对于等式:sum=p1*a1+p2*a2+...+pn*an

知道了n,我们就知道了n个系数p了,sum也知道

所以只要枚举1~n的排列,刚哪一个排列符合等式就ok了

又要字典序顺序,所以我们从小到大的顺序枚举,一有答案了,就跳出来。

 1 #include<cstdio>
 2 #include<cstring>
 3
 4 using namespace std;
 5
 6 const int maxn=13;
 7 int c[maxn][maxn];
 8 int a[maxn];
 9 int n,sum;
10 bool flag;
11
12 void init_c()
13 {
14     memset(c,0,sizeof c);
15     for(int i=1;i<maxn;i++)
16     {
17         c[i][1]=1;
18         for(int j=2;j<=i;j++)
19             c[i][j]=c[i-1][j-1]+c[i-1][j];
20     }
21 }
22
23 void solve()
24 {
25     int ret=0;
26     for(int i=1;i<=n;i++)
27     {
28         ret+=c[n][i]*a[i];
29     }
30     if(ret==sum)
31     {
32         flag=true;
33         for(int i=1;i<n;i++)
34             printf("%d ",a[i]);
35         printf("%d\n",a[n]);
36     }
37     return ;
38 }
39
40 void next(int cur)
41 {
42     if(flag)
43         return ;
44     if(cur==n+1)
45     {
46         solve();
47         return ;
48     }
49     for(int i=1;i<=n;i++)
50     {
51         int ok=1;
52         for(int j=1;j<cur;j++)
53         {
54             if(a[j]==i)
55                 ok=0;
56         }
57         if(ok)
58         {
59             a[cur]=i;
60             next(cur+1);
61         }
62     }
63
64 }
65
66 int main()
67 {
68     init_c();
69     while(~scanf("%d%d",&n,&sum))
70     {
71         flag=false;
72         next(1);
73     }
74     return 0;
75 }

时间: 2024-08-01 22:37:38

POJ 3187 杨辉三角+枚举排列 好题的相关文章

POJ 3187 Backward Digit Sums (杨辉三角,穷竭搜索,组合数,DFS)

http://poj.org/problem?id=3187 将一行数按杨辉三角的规则计算为一个数,已知最后那个数和三角形的高度,求最初的那行数. 杨辉三角前10行:                   1                                   1   1                               1   2   1                           1   3   3   1                       1  

POJ 3146 &amp; HDU 3304 Interesting Yang Yui Triangle(杨辉三角)

题目链接: HDU 3304 :http://acm.hdu.edu.cn/showproblem.php?pid=3304 POJ 3146  :http://poj.org/problem?id=3146 Problem Description Harry is a Junior middle student. He is very interested in the story told by his mathematics teacher about the Yang Hui trian

杨辉三角,二项式系数,组合数,斐波那契数列

古人就是厉害,在此%杨辉大佬,这个杨辉三角真的是好厉害啊. 杨辉三角 杨辉三角,是二项式系数在三角形中的一种几何排列.在欧洲,这个表叫做帕斯卡三角形.帕斯卡(1623----1662)是在1654年发现这一规律的,比杨辉要迟393年,比贾宪迟600年. 排列信息: 杨辉三角有多种重要的性质. 概述: 前提:每行端点与结尾的数为1. 每个数等于它上方两数之和. 每行数字左右对称,由1开始逐渐变大. 第n行的数字有n项. 第n行数字和为2n-1. 第n行的m个数可表示为 C(n-1,m-1),即为从

python 杨辉三角

1 1 2 1 1 3 1 2 1 4 1 3 3 1 5 1 4 6 4 1 6 1 5 10 10 5 1 7 1 6 15 20 15 6 1 8 1 7 21 35 35 21 7 1 9 1 8 28 56 70 56 28 8 1 10 1 9 36 84 126 126 84 36 9 1 11 1 10 45 120 210 252 210 120 45 10 1 12 1 11 55 165 330 462 462 330 165 55 11 1 13 1 12 66 220

php_js_css_html——杨辉三角

<?php function yanghui($lines){    echo '<head id=hd><head/>'; //头部插入css样式    echo '<a id=cow>',$lines,'</a>';    echo '<a id=column>',($lines - $lines%2)/2 + ($lines%2),'</a>';//想要设定每个表格遵从一样的宽度,                     

递归 正则表达式 杨辉三角

递归 1 1 2 3 5 8 13 21 34 ?1 2 3 4 5 6 7 8 9 ? function dg (n){ if (n == 1 || n == 2) { return 1; } else { return dg(n - 1) + dg(n - 2); } } alert(dg(5)); 正则表达式 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个"规则字符串",这个"规则字符串"用来表达对字符串

杨辉三角(Pascal Triangle)的几种C语言实现及其复杂度分析

说明 本文给出杨辉三角的几种C语言实现,并简要分析典型方法的复杂度. 本文假定读者具备二项式定理.排列组合.求和等方面的数学知识. 一  基本概念 杨辉三角,又称贾宪三角.帕斯卡三角,是二项式系数在三角形中的一种几何排列.此处引用维基百科上的一张动态图以直观说明(原文链接http://zh.wikipedia.org/wiki/杨辉三角): 从上图可看出杨辉三角的几个显著特征: 1. 每行数值左右对称,且均为正整数. 2. 行数递增时,列数亦递增. 3. 除斜边上的1外,其余数值均等于其肩部两数

python3 实现 杨辉三角

杨辉三角,是二项式系数在三角形中的一种几何排列.在欧洲,这个表叫做帕斯卡三角形.帕斯卡(1623----1662)是在1654年发现这一规律的,比杨辉要迟393年,比贾宪迟600年 概述 前提:每行端点与结尾的数为1. 每个数等于它上方两数之和. 每行数字左右对称,由1开始逐渐变大. 第n行的数字有n项. 第n行数字和为2n-1. 第n行的m个数可表示为 C(n-1,m-1),即为从n-1个不同元素中取m-1个元素的组合数. 第n行的第m个数和第n-m+1个数相等 ,为组合数性质之一. 每个数字

Python 中使用 for、while 循环打印杨辉三角练习(列表索引练习)。

Python中使用for while循环打印杨辉三角练习(列表索引练习). 杨辉三角是一个由数字排列成的三角形数表,一般形式如下: 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1 ....................... 杨辉三角最本质的特征是,它的两条斜边都是由数字1组成的,而其余的数则是等于它肩上的两个数之和. 方法一: __author__ = 'Brad' n = int(input('请输入你想打印杨辉三角