区切りを作る
n個の要素の列がある。n種類の線分に切り分けることを考える。要素なしの線分が出来てもよい。
n個の要素が作るn-1箇所の間隙と、n個の要素の両端2箇所の合わせてn+1箇所に区切りを入れることが可能で、区切りの数は、n種類の線分の境界であるn-1箇所。n-1箇所の区切りは同じ位置に入れることができる。
そのような区切り方は
n 場合
2 3
3 10
4 35
5 126
6 462
7 1716
8 6435
9 24310
10 92378
public class Runs {
public static void Runs_All(int n){
/*
* n-1本の区切りをn+1箇所に入れる。
* すべての区切りが同じ箇所に入っても可。
*/
int[] kugiri=new int[n-1];
boolean loop=true;
int count=0;
while(loop){
boolean tmpbool=true;
for(int i=0;i<kugiri.length;i++){
if(kugiri[i]<n){
tmpbool=false;
i=kugiri.length;
}
}
if(tmpbool){
loop=false;
}
count++;
for(int i=0;i<kugiri.length;i++){
System.out.print(kugiri[i]+"\t");
}
System.out.println();
kugiri=update(kugiri,n);
}
System.out.println("count\t"+count);
}
public static int[] update(int[] a,int max){
a[0]++;
for(int i=0;i<a.length-1;i++){
//System.out.println("i\t"+i+"\tret[i]\t"+a[i]);
if(a[i]>a[i+1]){
a[i+1]++;
if(i==0){
a[i]=0;
}else{
a[i]=a[i-1];
}
}
}
return a;
}
public static double term1(double x, int j,double a){
double ret=0;
for(int i=0;i<j;i++){
ret+=Math.log(x+a*i);
}
ret = Math.exp(ret);
return ret;
}
public static double factor(int n){
double ret =0;
for(int i=1;i<=n;i++){
ret += Math.log(i);
}
ret = Math.exp(ret);
return ret;
}
}