アットウィキロゴ

+++

#include <stdio.h>
#include <math.h>
double u(double c1,double l1){
double x1,x2,ux;
int pp;
x1=c1;
x2=l1;  
pp=0;  
if (x1<0) pp=100;
if (x2>0.99) pp=100;
if (x2<0) pp=100;  
if (pp>50)x1=0.5;
if (pp>50)x2=0.5;  
ux=log(x1)+log(1-x2);
if (pp>50)ux=-999;
return ux;
}
int main(void){
double th[101];
double y[11],c[11];
int m,s,n1,n2,n3;
double tl,tr;
double maxm,maxu,sumu,maxc,maxy,sumb;
double c1,y1,l1,c2,y2,l2,c3,y3,l3,u1,u2,u3;
double gu[11][3][3][3],gb[11][3][3][3],fastu[3][3],fastb[3][3];
double endu[3][3],endb[3][3],endv[3][3][11];
double v[10][3][3][40];
int gr[101],q,nx,qx,pp,max1,max2,maxq;
double h,vs,v1,maxv;
for (s=1;s<=100;s++){
th[s]=0.02*s;
}
for (m=0;m<=10;m++){
y[m]=0.1*m;
}
tl=0.1;
tr=0.01;
for (m=0;m<=10;m++){
c[m]=tr+(1-tl)*y[m];
}
for (s=1;s<=100;s++){
maxu=-999;
for (m=0;m<=10;m++){
c1=c[m];
l1=y[m]/th[s];
u1=u(c1,l1);
if (u1>maxu)maxm=m;
if (u1>maxu)maxu=u1;
}
gr[s]=maxm;
}
h=0.001;
for (m=1;m<=9;m++){
for (n1=-1;n1<=1;n1++){
for (n2=-1;n2<=1;n2++){
for (n3=-1;n3<=1;n3++){
sumu=0;
for (s=1;s<=100;s++){
maxu=-999;
maxm=m;
c1=c[m-1]+n1*h;
y1=y[m-1];
l1=y[m-1]/th[s];
u1=u(c1,l1);
c2=c[m]+n2*h;
y2=y[m];
l2=y[m]/th[s];
u2=u(c2,l2);
c3=c[m+1]+n3*h;
y3=y[m+1];
l3=y[m+1]/th[s];
u3=u(c3,l3);
if (u1>maxu)maxm=m-1;
if (u1>maxu)maxu=u1;
if (u2>maxu)maxm=m;
if (u2>maxu)maxu=u2;
if (u3>maxu)maxm=m+1;
if (u3>maxu)maxu=u3;
if (gr[s]==m)sumu=sumu+maxu;
gu[m][n1+1][n2+1][n3+1]=sumu;
}
}
}
}
}
for (n1=-1;n1<=1;n1++){
for (n2=-1;n2<=1;n2++){
sumu=0;
for (s=1;s<=100;s++){
maxu=-999;
maxm=m;
c1=c[0]+n1*h;
y1=y[0];
l1=y[0]/th[s];
u1=u(c1,l1);
c2=c[1]+n2*h;
y2=y[1];
l2=y[1]/th[s];
u2=u(c2,l2);
if (u1>maxu)maxm=m-1;
if (u1>maxu)maxu=u1;
if (u2>maxu)maxm=m;
if (u2>maxu)maxu=u2;
if (gr[s]==0)sumu=sumu+maxu;
}
fastu[n1+1][n2+1]=sumu;
}
}
for (n1=-1;n1<=1;n1++){
for (n2=-1;n2<=1;n2++){
sumu=0;
for (s=1;s<=100;s++){
maxu=-999;
maxm=m;
c1=c[9]+n1*h;
y1=y[9];
l1=y[9]/th[s];
u1=u(c1,l1);
c2=c[10]+n2*h;
y2=y[10];
l2=y[10]/th[s];
u2=u(c2,l2);
if (u1>maxu)maxm=m-1;
if (u1>maxu)maxu=u1;
if (u2>maxu)maxm=m;
if (u2>maxu)maxu=u2;
if (gr[s]==10)sumu=sumu+maxu;
}
endu[n1+1][n2+1]=sumu;
}
}
for (m=1;m<=9;m++){
for (n1=-1;n1<=1;n1++){
for (n2=-1;n2<=1;n2++){
for (n3=-1;n3<=1;n3++){
sumb=0;
for (s=1;s<=100;s++){
maxu=-999;
maxm=m;
c1=c[m-1]+n1*h;
y1=y[m-1];
l1=y[m-1]/th[s];
u1=u(c1,l1);
c2=c[m]+n2*h;
y2=y[m];
l2=y[m]/th[s];
u2=u(c2,l2);
c3=c[m+1]+n3*h;
y3=y[m+1];
l3=y[m+1]/th[s];
u3=u(c3,l3);
if (u1>maxu)maxc=c1;
if (u1>maxu)maxy=y1;
if (u1>maxu)maxu=u1;
if (u2>maxu)maxc=c2;
if (u2>maxu)maxy=y2;
if (u2>maxu)maxu=u2;
if (u3>maxu)maxc=c3;
if (u3>maxu)maxy=y3;
if (u3>maxu)maxu=u3;
if (gr[s]==m)sumb=sumb+maxy-maxc;
}
gb[m][n1+1][n2+1][n3+1]=sumb;
}
}
}
}
for (n1=-1;n1<=1;n1++){
for (n2=-1;n2<=1;n2++){
sumb=0;
for (s=1;s<=100;s++){
maxu=-999;
c1=c[0]+n1*h;
y1=y[0];
l1=y[0]/th[s];
u1=u(c1,l1);
c2=c[1]+n2*h;
y2=y[1];
l2=y[1]/th[s];
u2=u(c2,l2);
if (u1>maxu)maxc=c1;
if (u1>maxu)maxy=y1;
if (u1>maxu)maxu=u1;
if (u2>maxu)maxc=c2;
if (u2>maxu)maxy=y2;
if (u2>maxu)maxu=u2;
if (gr[s]==0)sumb=sumb+maxy-maxc;
}
fastb[n1+1][n2+1]=sumb;
}
}
for (n1=-1;n1<=1;n1++){
for (n2=-1;n2<=1;n2++){
sumb=0;
for (s=1;s<=100;s++){
maxu=-999;
maxm=m;
c1=c[9]+n1*h;
y1=y[9];
l1=y[9]/th[s];
u1=u(c1,l1);
c2=c[10]+n2*h;
y2=y[10];
l2=y[10]/th[s];
u2=u(c2,l2);
if (u1>maxu)maxc=c1;
if (u1>maxu)maxy=y1;
if (u1>maxu)maxu=u1;
if (u2>maxu)maxc=c2;
if (u2>maxu)maxy=y2;
if (u2>maxu)maxu=u2;
if (gr[s]==10)sumb=sumb+maxy-maxc;
}
endb[n1+1][n2+1]=sumb;
}
}
for (n1=-1;n1<=1;n1++){
for (n2=-1;n2<=1;n2++){
for (q=-20;q<=20;q++){
v[0][n1+1][n2+1][q+20]=-999;
}
}
}
for (n1=-1;n1<=1;n1++){
for (n2=-1;n2<=1;n2++){
q=floor((fastb[n1+1][n2+1]-fastb[1][1])/h);
v[0][n1+1][n2+1][q+20]=fastu[n1+1][n2+1];
}
}
for (s=1;s<=9;s++){
for (n2=-1;n2<=1;n2++){
for (n3=-1;n3<=1;n3++){
for (q=-20;q<=20;q++){
vs=-999;
for (n1=-1;n1<=1;n1++){
u1=gu[s][n1+1][n2+1][n3+1];
qx=q-floor((gb[s][n1+1][n2+1][n3+1]-gb[s][1][1][1])/h);
pp=0;
if (qx>10)pp=100;
if (qx<-10)pp=100;
if (pp>10)qx=0;
v1=u1+v[s-1][n1+1][n2+1][qx+20];
if (pp>10)v1=-999;
if (v1>vs)vs=v1;
}
v[s][n2+1][n3+1][qx+20]=vs;
}
}
}
}
for (n1=-1;n1<=1;n1++){
for (n2=-1;n2<=1;n2++){
for (q=-5;q<=5;q++){
u1=endu[n1+1][n2+1];
qx=q-floor((endb[n1+1][n2+1]-endb[1][1])/h);
pp=0;
if (qx>20)pp=100;
if (qx<-20)pp=100;
if (pp>10)qx=0;
vs=u1+v[9][n1+1][n2+1][qx+20];
if (pp>10)vs=-999;
endv[n1+1][n2+1][q+5]=vs;
}
}
}
maxv=-999;
for (n1=-1;n1<=1;n1++){
for (n2=-1;n2<=1;n2++){
for (q=0;q<=5;q++){
if (endv[n1+1][n2+1][q+5]>maxv)max1=n1;
if (endv[n1+1][n2+1][q+5]>maxv)max2=n2;
if (endv[n1+1][n2+1][q+5]>maxv)maxq=q;
if (endv[n1+1][n2+1][q+5]>maxv)maxv=endv[n1+1][n2+1][q+5];
}
}
}
printf("%d",max1);
printf("\n");

return 0;
}
最終更新:2009年12月01日 05:13