本人的思路是这样的:
不妨令操作数序列为1,2,3,4,输出序列总数目为dc(n)
(1)输出序列第一个数为1时,剩下的也就是2,3,4的输出序列数,即dc(3);
(2)输出序列第一个数是2时,可以看作是1,3,4的输出序列数,也为dc(3);
(3)输出序列第一个数是3时,2一定在1的前面,由排列组合公式,此时的情况有3!/2!=3种(高中数学的定序问题)
(4)输出序列第一个数是4时,3,2,1顺序已固定,即3!/3!=1种
故得出递推公式:dc(4)+=dc(3)+dc(3)+3!/2!+3!/3!
操作序列长度为五时类似可得:dc(5)=dc(4)+dc(4)+4!/2!+4!/3!+4!/4!
C++代码实现(只给出函数部分):
long long int dc( int a ){
long long int ret=0;
if( a==1 )
ret=1;
else if( a==2 )
ret=2;
else{
long long int sum1=1,sum2=0;
for( int j=2 ; j<a ; j++ ){
for( int i=a-1 ; i>j ; i-- )
sum1*=i;
sum2+=sum1;
sum1=1;
}
ret+=2*dc(a-1)+sum2;
}
return ret;
}
此方法得出1,2,3,4均与答案一致,劳烦各路高人指点一下方法不合理之处在哪里,不甚感激