区切りを作る
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; } }