新普金娱乐网址


数学一直车手心路历程

老三节 数据结构

数学母函数及连锁的终究法题

  • 十月 11, 2018
  • 数学
  • 没有评论

矩阵:一个m×n的矩阵就是m×n个数排成m行n列的一个数阵。由于其把成千上万多少紧凑的汇总到了一块儿,所以有时可以方便地表示有繁杂的模子。在数学中,一个矩阵说通过了就是一个二维数组。
单位矩阵:从左上角交右手下角的针对角线(称为主对角线)上的元素都为1。除本条之外都为0。
针对如矩阵:如果方阵满足,即,则称A为对称矩阵.它的素以主对角线为对称轴对许相等.

母函数就生成函数,构造这么一个基本上项式函数g(x),使得x的n次方系数为f(n),是成数学中尤为是计数方面的一个重点理论与工具。

矩阵加减法:个别只矩阵相加减,即她同样位置的素相加减,满足交换律和结合律。只有对个别单行数、列数分别相当于的矩阵(即同型矩阵),加减法运算才有含义,即加以减运算是可行之.

 

数学 1

 

矩阵乘法:矩阵乘法是同样种植高效的算法可以拿部分一维递推进优化及log( n
),还足以请路径方案等,所以还是一律种植应用性极强的算法。
1.矩阵同一再的乘法:数乘矩阵A,就是用反复就矩阵A中的诸一个素,记否或.特别地,称曰的负矩阵.满足结合律和分配律。

(1+a1x)(1+a2x)(1+a3x)…(1+anx)=1+(a1+a2+a3+…+an)x+(a1a2+a1a3+…+an-1an)x2+…+(a1a2a3*…*an)xn

数学 2

通过可看出:

2.矩阵和矩阵的乘法:惟有当矩阵A的列数与矩阵B的行数相等时A×B才发生义。一个m×n的矩阵a(m,n)左乘一个n×p的矩阵b(n,p),会博得一个m×p的矩阵c(m,p),矩阵乘法满足结合率,但非满足交换率。一个n行m列的矩阵可以随着以一个m行p列的矩阵,得到的结果是一个n行p列的矩阵。方阵A和它同阶的单位阵作乘积,结果仍为A,即.单位阵在矩阵乘法中的图相当给数1以咱们常见乘法中之企图。运算规则:
  设,,则A与B的积是如此一个矩阵:
  (1) 行数与(左矩阵)A相同,列数与(右矩阵)B相同,即.
  (2)
C的第行第列的因素由A的第行元素与B的第列元素对应相乘,再取乘积之和.
(3)两独非零矩阵的积可以是零矩阵.由此若,不可知查获或的结论.

1.
x的系数是a1,a2,…an的么组合的整个。相当给从a1,a2,…an选1个拓展重组,然后加在一起

数学 3

2.
x2的系数是a1,a2,…an的个别只组成的一体。相当给从a1,a2,…an选2个进行重组,然后加在一起

数学 4

………

数学 5

n.
xn的系数是a1,a2,….an的n个组合的合(只来1独)。相当给从a1,a2,…an选n个开展重组,然后加在一起

数学 6

一旦我们把a1,a2,…an的值设为1的话语

矩阵转置:将矩阵A的行换成跟序号的列所得到的新矩阵称为矩阵A的转置矩阵,记作或.第i行变第J列。Aij变成Aji。
运算性质(假设运算都是实惠之)
  (1) 
  (2) 
  (3) 
  (4) ,是常数.

原式就成了

矩阵行列式:据悉矩阵所富含的队列数据计算得到的一个标量;
二维矩阵[{a,c},{b,d}]的行列式等于:det(A) = ab-cd。
n维矩阵的行列式:假设矩阵A为n维的方阵,定义Aij为于A中删去第i行、第j排列之后剩下的n-1维方阵。
得本着A的第一履行来要取行列式:det(A) =
a11*A11-a12*A12+…+a1n*A1n,这是一个递归的概念,包含n项,每一样件的正负号等于
(-1)的(i+j)次方。
实际上可以对A的任性一行、任意一排列本点的计来求取行列式,可以选择包含0比较多得执行(列)。
少独二维向量v1,v2,可以当做平行四边形之临边来定义一个平行四边形。两单向量构成矩阵A={v1,v2},那么平行四边形之面积
= det(A)的绝对值。
矩阵行列式的有的法则
1)如果矩阵A= {r1,r2,…ri…,rn} B={r1,r2,…ri’,…rn}
C={r1,r2,…ri+ri’,…rn},则有det(C) = det(A)+det(B)
2)如果矩阵A有星星点点实践(列)相等则,det(A) = 0
3)如果矩阵A将两行交换后取得矩阵B,则有det(A)=-det(B)
4)如果矩阵A进行行变换后得到矩阵B,则生det(A)=det(B);可以经行变换达到3)的意义,这个过程中见面有-1累乘胜某行。

(1+x)n=1+C(n,1)x+C(n,2)x2+C(n,3)x3+…+C(n,n)xn

 

行使这种涉及,我们得以解决部分算法问题

例1、有面值为1,2,3底硬币各一个,问出几种植组成?

我们把富有的做这样想:

(不以面值为1的,拿一个面值为1之)*(不以一个面值为2的,拿一个面值为2之)*(不将一个面值为3底,拿一个面值为3的)

==(面值为0的个数,面值为1的个数,面值为2的个数,面值为3的个数,面值为4的个数,面值为5的个数,面值为6的个数)

咱俩用x表示硬币,x的指数表示硬币的面值,这样:

1克的硬币成可用函数x0+x1意味着,x0表示未将一个面值为1的,x1表示以一个面值为1之

2限量的硬币成得用函数x0+x2表示,x0表示不以一个面值为2底,x2意味着将一个面值为2的

3限制之硬币成可据此函数x0+x3意味着,x0表示不将一个面值为3的,x3代表用一个面值为3底

富有的结就足以这样表示出了:

(1+x)(1+x2)(1+x3)==1+x+x2+2x3+x4+x5+x6

x前之系数即相当给称出相应硬币的面值的整合数目

按照面值为3底发出少种植组成,(拿一个面值为3之,和那一个1只面值为1与面值为2底)

 

例2、有面值为1底硬币3只,面值为2底硬币2独,面值为3的硬币1个,问出稍许种组成?

1克的硬币成可据此函数x0+x1
+x2+x3表示,x0表示不以一个面值为1之,x1意味着将1个面值为1的,x2代表用2只面值为1底,x3表示将3独面值为1的

2范围的硬币成得用函数x0+x2+x4表示,x0意味着未将一个面值为2的,x2表示用一个面值为2之,x4意味着将3单面值为2的

3限之硬币成得为此函数x0+x3表示,x0代表未将一个面值为3底,x3表示以1单面值为3之,x6代表将2独面值为3底

具备的组成就可以这么表示出了:

(x0+x1
+x2+x3)*(x0+x2+x4)*(
x0+x3)

 

 

例3、有面值为1,2,3的硬币无数个,问出多少种组成?

1克的硬币成可据此函数x0+x1
+x2+…+xn代表,分别表示拿0独,1独,2个…n个底情事。

2限的硬币成得用函数x0+x2+x4+…+x2n代表,分别表示拿0独,1独,2独,n个的事态。

3限量之硬币成得用函数x0+x3+x6+…+x3n意味着,分别代表拿0只,1独,2独,n个的景况。

具备的结缘就足以如此表示出了:

(x0+x1
+x2+…+xn)*(x0+x2+x4+…+x2n)*(x0+x3+x6+…+x3n)

 

 

今昔就是例2的事例让有代码和分析

来面值为1的硬币3单,面值为2之硬币2只,面值为3底硬币1独,问有些许种组成?

//(x0+x1 +x2+x3)*(x0+x2+x4)*( x0+x3)

struct Coin
{
    int value;
    int number;
};


const int MAX = 50;
int main()
{
    Coin coin[3];
    coin[0].value = 1;
    coin[0].number = 3;

    coin[1].value = 2;
    coin[1].number = 2;

    coin[2].value = 3;
    coin[2].number = 1;

    int result[MAX] = { 0 };
    int temp[MAX] = { 0 };

    int number;
    while (cin >> number)
    {
        for (int i = 0; i < MAX; i++)
        {
            result[i] = 0;
            temp[i] = 0;
        }
        for (int i = 0; i <=coin[0].number;i++)
        {
            result[i*coin[0].value] = 1;
        }
        for (int i = 1; i < 3; i++)
        {
            for (int j = 0; j <=number; j++)
            {
                for (int k = 0, index = 0;
                    index <=coin[i].number && (k + j)<=number;
                    index++, k += coin[i].value)
                {
                    temp[j + k] += result[j];
                }
            }

            for (int j = 0; j <=number; j++)
            {
                result[j] = temp[j];
                temp[j] = 0;
            }
        }
        cout << result[number] << endl;
    }
}

 

俺们对②拓展分析

它的循环不变式是result[0]-result[number]笔录了每次新增面额为coin[i].value时之兼具组成数目,面值为i的有result[i]种组合。
初始化:第一,先来说明在第一轱辘迭代之前,它是建立的。
在①中,把第一只面额硬币的组合赋给了result,for (int i = 0; i
<=coin[0].number;i++)①
{
result[i*coin[0].value] = 1;
}

这时候result记录了第一单面额硬币的持有组成及其数量。所以在循环开始前循环不变式是对的。

 

保持
这里的i代表了目前划算的架势,因为①早就算截止了第一个相,所以i从1开端,到2告终(数组的下标是从0开始)

j每次用更新的面值,所以从0开始到number截止,

k代表了第i单姿态的增量,index第i只相的第几只遍历。所以对于第i独姿态,k为coin[i].value,index从0开始到coin[i].number截止;当index已经coin[i].number或是当前面值j加上增量k之后曾超越了所要求的面值即可停止循环

老是迭代面值为j的,现在面值变成了j+k的,所以面值为j+k的呢耶原本的面值为j的数目加上新的面值为j+k的数码

接下来以temp赋予result,将temp清零,开始产一致涂鸦迭代。

 

终止:对是算法来说,当i大于数组的长度(即具有面额的硬币都盘算了),for循环结束。这时result[0]-result[number]笔录了面额也0顶number所有组合的数额

 

 

 

参照文章:

母函数(Generating function)详解http://www.wutianqi.com/?p=596

什么是生成函数? http://www.matrix67.com/blog/archives/120

相关文章

No Comments, Be The First!
近期评论
    分类目录
    功能
    网站地图xml地图