class pro{
String str;
int[] z=new int[100];
int[] zz=new int[100];
String[] ph=new String[100];
int[] np=new int[100];
int s,sx,strlong,phnumber,dicnumber,wordnumber;
String[] dic=new String[100];
double[] p=new double[100];
String[] word=new String[100];
int[] nword=new int[100];
int[][] mk=new int[1000][100];
int[] mknumber=new int[1000];
int t;
int[] num=new int[100];
double[] q=new double[100];
String[] bun=new String[100];
double p1,point,maxp;
int trial;
public static void main(String args[]){
pro test=new pro();
}
pro(){
dicnumber=0;
p[0]=1;
bun[1]="朝日は昇る";
bun[2]="夕日は沈む";
bun[3]="朝日は沈む";
bun[4]="夕日は昇る";
for(t=1;t<5;t++){
str=bun[t];
strlong=str.length();
maxp=-999;
for (trial=1;trial<10;trial++){
z[0]=1;
for(s=1;s<strlong;s++){
z[s]=0;
if(Math.random()>0.5)z[s]=1;
}
sx=1;
zz[sx]=0;
for(s=1;s<strlong;s++){
if(z[s]==1)sx=sx+1;
if(z[s]==1)zz[sx]=s;
}
phnumber=sx;
for(s=1;s<phnumber;s++){
ph[s]=str.substring(zz[s],zz[s+1]);
}
s=phnumber;
ph[s]=str.substring(zz[s],strlong);
for(s=1;s<phnumber+1;s++){
np[s]=0;
for(sx=1;sx<dicnumber+1;sx++){
if(ph[s].equals(dic[sx]))np[s]=sx;
}
}
sx=np[1];
point=p[sx];
for(s=1;s<phnumber;s++){
p1=price(t,np[s],np[s+1]);
point=p1*point;
}
System.out.println(point);
if(point>maxp)word=ph;
if(point>maxp)wordnumber=phnumber;
if(point>maxp)nword=np;
if(point>maxp)maxp=point;
}
for(s=1;s<wordnumber+1;s++){
if(nword[s]==0)makedic(s);
}
for(s=1;s<dicnumber+1;s++){
num[s]=0;
}
for(s=1;s<wordnumber+1;s++){
sx=nword[s];
if(sx>0)num[sx]=num[sx]+1;
if(sx==0)makecount(s);
}
for(s=1;s<dicnumber+1;s++){
q[s]=(double)num[s]/wordnumber;
}
for(s=1;s<dicnumber+1;s++){
p[s]=0.1*q[s]+0.9*p[s];
}
mknumber[t]=wordnumber;
for(s=1;s<wordnumber+1;s++){
if(nword[s]>0)mk[t][s]=nword[s];
if(nword[s]==0)mk[t][s]=makemk(t,s);
}
}
}
void makecount(int s){
int sx,sxs;
sxs=0;
for(sx=1;sx<dicnumber+1;sx++){
if(word[s].equals(dic[sx]))sxs=sx;
}
num[sxs]=num[sxs]+1;
}
int makemk(int t,int s){
int sx,sxs;
sxs=0;
for(sx=1;sx<dicnumber+1;sx++){
if(word[s].equals(dic[sx]))sxs=sx;
}
return sxs;
}
void makedic(int s){
int sx,h;
h=0;
for(sx=1;sx<dicnumber+1;sx++){
if(word[s].equals(dic[sx]))h=100;
}
if(h<50)dicnumber=dicnumber+1;
if(h<50)dic[dicnumber]=word[s];
}
double price(int t,int m1,int m2){
double p1,p2,px;
int tx,t1,t2;
int sx;
int h;
t1=t-100;
if(t1<1)t1=1;
t2=t;
px=0.001;
p1=0;
for(tx=t1;tx<t2;tx++){
for(sx=1;sx<mknumber[tx];sx++){
if(mk[tx][sx]==m1)p1=p1+1;
}
}
p2=0;
for(tx=t1;tx<t2;tx++){
for(sx=1;sx<mknumber[tx];sx++){
h=0;
if(mk[tx][sx]==m1)h=h+1;
if(mk[tx][sx+1]==m2)h=h+1;
if(h==2)p2=p2+1;
}
}
if(p1>0)px=(double)p2/p1;
return px;
}
}
最終更新:2011年05月24日 00:07