序关系计数问题问题描述:用关系“<”和“=”将3 个数A、B和C依序排列时有13 种不同的序关系: A=B=C,A=Bi-1时, A[i,j]=0,显然我们有A[i,0]=1,i=1~n。当用j个"<"号来连接i个数时,具有如下的形式: S1 < S2 < ...... < Sj+1 Sk(1≤k≤j+1) 中的各数用等号"="连接。对于A[i,j],考虑在i-1个数的基础上增加一个数的情形。 新增加的数x可以在上式 Sk(1≤k≤j+1) 中任何一个中, 当x∈Sk,且i-1个数时已有j个"<"号,此时产生的不 同的序关系为A[i-1,j]; 当i-1个数时只有j-1个"<"号时, Sk={x},且新增一个"<"号 ,此时的不同序关序有A[i-1,j-1]。因此,x∈Sk时产生的不同序关系为 A[i-1,j-1]+A[i-1,j]。 由于x∈Sk(1≤k≤j+1),共有j+1种不同的情形,因此,产生 的所有不同序关系为: A[i,j]=(j+1)(A[i-1,j-1]+A[i-1,j]) 经过简化后的递归式在计算A[i,j]时只用到第i-1行中的2个数,因此只要保存第i-1行 的数据就可以了。 int Orderings(int n) ...{ A[0]=1; for(int j=1;j<=n-1;j++) A[j]=0; for(int i=2;i<=n;i++) for(int j=i-1;j>=1;j--) A[j]=(j+1)*(A[j-1]+A[j]); int total=0; for(int j=0;j<=n-1;j++) total+=A[j]; return total; } 修改后的算法只需要O(n)空间和O(n^2)计算时间 。
感悟:算法的设计是很有挑战性与艺术性的,对于一个问题,怎么着手用数学模型来解决,确实要有点悟性!