public class tax213{
public static void main(String[] args) {
double th1[]=new double[11];
double th2[]=new double[11];
double y1[][]=new double[11][11];
double y2[][]=new double[11][11];
double c[][]=new double[11][11];
double ys1[][][]=new double[11][11][3];
double ys2[][][]=new double[11][11][3];
double cs[][][]=new double[11][11][3];
double us[][][][][]=new double[11][11][3][3][3];
double ws[][][][][]=new double[11][11][3][3][3];
double vs[][][][][][]=new double[11][11][3][3][3][11];
int gotoc[][][][][][]=new int[11][11][3][3][3][11];
int goto1[][][][][][]=new int[11][11][3][3][3][11];
int goto2[][][][][][]=new int[11][11][3][3][3][11];
int gotom[][][][][][]=new int[11][11][3][3][3][11];
int nextc[][][][][]=new int[11][3][3][3][11];
int next1[][][][][]=new int[11][3][3][3][11];
int next2[][][][][]=new int[11][3][3][3][11];
int nextm[][][][][]=new int[11][3][3][3][11];
double endv[][][][][]=new double[11][3][3][3][11];
double sumu[][]=new double[11][11];
int endc[][]=new int[11][11];
int end1[][]=new int[11][11];
int end2[][]=new int[11][11];
double sumv[][]=new double[11][11];
int gotomx[][]=new int[11][11];
int opm[]=new int[11];
int op[]=new int[11];
int opc[][]=new int[11][11];
int op1[][]=new int[11][11];
int op2[][]=new int[11][11];
double tk,tl,tr;
double c1,w1,w2,l1,l2,u1,v1;
double we;
double maxwel,maxtk,maxtl,maxtr;
double h;
double maxv;
int s1,s2,n1,n2,n3,m,j;
int nx1,nx2,nx3,z,mx,mp,mxs;
int nxs1,nxs2,nxs3,ns1,ns2,ns3;
int t1,ep;
for (s1=1;s1<11;s1++){
th1[s1]=0.2*s1;
}
for (s2=1;s2<11;s2++){
th2[s2]=0.1*s2;
}
maxwel=-999;
maxtk=0;
maxtl=0;
maxtr=0;
for (n1=10;n1<40;n1++){
for (n2=10;n2<40;n2++){
tk=0.01*n1;
tl=0.01*n2;
tr=trs(tk,tl,th1,th2);
we=wel(tk,tl,tr,th1,th2);;
if (we>maxwel)maxtk=tk;
if (we>maxwel)maxtl=tl;
if (we>maxwel)maxtr=tr;
if (we>maxwel)maxwel=we;
}
}
tk=maxtk;
tl=maxtl;
tr=maxtr;
v1=0;
for (s1=1;s1<11;s1++){
for (s2=1;s2<11;s2++){
l1=mlx(s1,s2,tk,tl,tr,th1,th2);
l2=flx(s1,s2,tk,tl,tr,th1,th2);
w1=(1-tk)*th1[s1];
w2=(1-tl)*th2[s2];
y1[s1][s2]=th1[s1]*l1;
y2[s1][s2]=th2[s2]*l2;
c[s1][s2]=w1*l1+w2*l2+tr;
c1=c[s1][s2];
v1=v1+ux(c1,l1,l2);
}
}
System.out.println(v1);
h=0.001;
t1=0;
while(t1<100){
for (s1=1;s1<11;s1++){
for (s2=1;s2<11;s2++){
for (n1=-1;n1<2;n1++){
for (n2=-1;n2<2;n2++){
for (n3=-1;n3<2;n3++){
ys1[s1][s2][n1+1]=y1[s1][s2]+n1*h;
ys2[s1][s2][n2+1]=y2[s1][s2]+n2*h;
cs[s1][s2][n3+1]=c[s1][s2]+n3*h;
l1=ys1[s1][s2][n1+1]/th1[s1];
l2=ys2[s1][s2][n2+1]/th2[s2];
c1=cs[s1][s2][n3+1];
us[s1][s2][n1+1][n2+1][n3+1]=ux(c1,l1,l2);
}
}
}
}
}
for (s1=1;s1<11;s1++){
for (s2=1;s2<10;s2++){
for (n1=-1;n1<2;n1++){
for (n2=-1;n2<2;n2++){
for (n3=-1;n3<2;n3++){
ys1[s1][s2][n1+1]=y1[s1][s2]+n1*h;
ys2[s1][s2][n2+1]=y2[s1][s2]+n2*h;
cs[s1][s2][n3+1]=c[s1][s2]+n3*h;
l1=ys1[s1][s2][n1+1]/th1[s1];
l2=ys2[s1][s2][n2+1]/th2[s2+1];
c1=cs[s1][s2][n3+1];
ws[s1][s2][n1+1][n2+1][n3+1]=ux(c1,l1,l2);
}
}
}
}
}
for (s1=1;s1<11;s1++){
for (n1=-1;n1<2;n1++){
for (n2=-1;n2<2;n2++){
for (n3=-1;n3<2;n3++){
for (m=-5;m<6;m++){
vs[s1][1][n1+1][n2+1][n3+1][m+5]=-999;
}
}
}
}
}
for (s1=1;s1<11;s1++){
for (n1=-1;n1<2;n1++){
for (n2=-1;n2<2;n2++){
for (n3=-1;n3<2;n3++){
m=n1+n2-n3;
vs[s1][1][n1+1][n2+1][n3+1][m+5]=us[s1][1][n1+1][n2+1][n3+1];
}
}
}
}
for (s1=1;s1<11;s1++){
for (s2=2;s2<10;s2++){
for (n1=-1;n1<2;n1++){
for (n2=-1;n2<2;n2++){
for (n3=-1;n3<2;n3++){
for (m=-5;m<6;m++){
mx=m-n1-n2+n3;
u1=us[s1][s2][n1+1][n2+1][n3+1];
z=0;
if (mx>5)z=100;
if (mx<-5)z=100;
if (z>50)mx=0;
maxv=-999;
nxs1=0;
nxs2=0;
nxs3=0;
for (nx1=-1;nx1<2;nx1++){
for (nx2=-1;nx2<2;nx2++){
for (nx3=-1;nx3<2;nx3++){
v1=u1+vs[s1][s2-1][nx1+1][nx2+1][nx3+1][mx+5];
if (ws[s1][s2-1][nx1+1][nx2+1][nx3+1]>u1)v1=-999;
if (v1>maxv)nxs1=nx1;
if (v1>maxv)nxs2=nx2;
if (v1>maxv)nxs3=nx3;
if (v1>maxv)maxv=v1;
}
}
}
if (z>50)maxv=-999;
goto1[s1][s2][n1+1][n2+1][n3+1][m+5]=nxs1;
goto2[s1][s2][n1+1][n2+1][n3+1][m+5]=nxs2;
gotoc[s1][s2][n1+1][n2+1][n3+1][m+5]=nxs3;
gotom[s1][s2][n1+1][n2+1][n3+1][m+5]=mx;
vs[s1][s2][n1+1][n2+1][n3+1][m+5]=maxv;
}
}
}
}
}
}
for (s1=1;s1<11;s1++){
for (n1=-1;n1<2;n1++){
for (n2=-1;n2<2;n2++){
for (n3=-1;n3<2;n3++){
for (m=-5;m<6;m++){
mx=m-n1-n2+n3;
u1=us[s1][10][n1+1][n2+1][n3+1];
z=0;
if (mx>5)z=100;
if (mx<-5)z=100;
if (z>50)mx=0;
maxv=-999;
nxs1=0;
nxs2=0;
nxs3=0;
for (nx1=-1;nx1<2;nx1++){
for (nx2=-1;nx2<2;nx2++){
for (nx3=-1;nx3<2;nx3++){
v1=u1+vs[s1][9][nx1+1][nx2+1][nx3+1][mx+5];
if (ws[s1][9][nx1+1][nx2+1][nx3+1]>u1)v1=-999;
if (v1>maxv)nxs1=nx1;
if (v1>maxv)nxs2=nx2;
if (v1>maxv)nxs3=nx3;
if (v1>maxv)maxv=v1;
}
}
}
if (z>50)maxv=-999;
next1[s1][n1+1][n2+1][n3+1][m+5]=nxs1;
next2[s1][n1+1][n2+1][n3+1][m+5]=nxs2;
nextc[s1][n1+1][n2+1][n3+1][m+5]=nxs3;
nextm[s1][n1+1][n2+1][n3+1][m+5]=mx;
endv[s1][n1+1][n2+1][n3+1][m+5]=maxv;
}
}
}
}
}
for (s1=1;s1<11;s1++){
for (m=-5;m<6;m++){
maxv=-999;
ns1=0;
ns2=0;
ns3=0;
for (n1=-1;n1<2;n1++){
for (n2=-1;n2<2;n2++){
for (n3=-1;n3<2;n3++){
v1=endv[s1][n1+1][n2+1][n3+1][m+5];
if (v1>maxv)ns1=n1;
if (v1>maxv)ns2=n2;
if (v1>maxv)ns3=n3;
if (v1>maxv)maxv=v1;
}
}
}
end1[s1][m+5]=ns1;
end2[s1][m+5]=ns2;
endc[s1][m+5]=ns3;
sumu[s1][m+5]=maxv;
}
}
for (m=-5;m<6;m++){
sumv[1][m+5]=sumu[1][m+5];
}
for (s1=2;s1<10;s1++){
for (m=-5;m<6;m++){
maxv=-999;
mxs=0;
for (mp=-5;mp<6;mp++){
u1=sumu[s1][mp+5];
mx=m-mp;
z=0;
if (mx>5)z=100;
if (mx<-5)z=100;
if (z>50)mx=0;
v1=u1+sumv[s1-1][mx+5];
if (z>50)v1=-999;
if (v1>maxv)mxs=mx;
if (v1>maxv)maxv=v1;
}
sumv[s1][m+5]=maxv;
gotomx[s1][m+5]=mxs;
}
}
maxv=-999;
mxs=0;
for (mp=-5;mp<6;mp++){
u1=sumu[10][mp+5];
mx=-mp;
v1=u1+sumv[9][mx+5];
if (v1>maxv)mxs=mx;
if (v1>maxv)maxv=v1;
}
opm[9]=mxs;
for (j=1;j<9;j++){
s1=9-j;
m=opm[s1+1];
opm[s1]=gotomx[s1+1][m+5];
}
op[1]=opm[1];
op[10]=-opm[9];
for (s1=2;s1<10;s1++){
op[s1]=opm[s1]-opm[s1-1];
}
for (s1=1;s1<11;s1++){
m=op[s1];
op1[s1][10]=end1[s1][m+5];
op2[s1][10]=end2[s1][m+5];
opc[s1][10]=endc[s1][m+5];
n1=op1[s1][10];
n2=op2[s1][10];
n3=opc[s1][10];
op1[s1][9]=next1[s1][n1+1][n2+1][n3+1][m+5];
op2[s1][9]=next2[s1][n1+1][n2+1][n3+1][m+5];
opc[s1][9]=nextc[s1][n1+1][n2+1][n3+1][m+5];
for (j=1;j<9;j++){
s2=9-j;
n1=op1[s1][s2+1];
n2=op2[s1][s2+1];
n3=opc[s1][s2+1];
op1[s1][s2]=goto1[s1][s2+1][n1+1][n2+1][n3+1][m+5];
op2[s1][s2]=goto2[s1][s2+1][n1+1][n2+1][n3+1][m+5];
opc[s1][s2]=gotoc[s1][s2+1][n1+1][n2+1][n3+1][m+5];
m=gotom[s1][s2+1][n1+1][n2+1][n3+1][m+5];
}
}
for (s1=1;s1<11;s1++){
for (s2=1;s2<11;s2++){
c[s1][s2]=c[s1][s2]+opc[s1][s2]*h;
y1[s1][s2]=y1[s1][s2]+op1[s1][s2]*h;
y2[s1][s2]=y2[s1][s2]+op2[s1][s2]*h;
}
}
ep=0;
for (s1=1;s1<11;s1++){
for (s2=1;s2<11;s2++){
ep=ep+opc[s1][s2]*opc[s1][s2];
ep=ep+op1[s1][s2]*op1[s1][s2];
ep=ep+op2[s1][s2]*op2[s1][s2];
}
}
System.out.println(ep);
System.out.println(maxv);
if (ep<1)t1=100000;
t1=t1+1;
}
}
static double bud(double tk,double tl,double tr,double th1[],double th2[]){
double b1,w1,w2,l1,l2,c1;
int s1,s2,i;
b1=0;
for (s1=1;s1<11;s1++){
for (s2=1;s2<11;s2++){
w1=(1-tk)*th1[s1];
w2=(1-tl)*th2[s2];
l1=1-(w1+w2+tr)/(3*w1);
l2=1-(w1+w2+tr)/(3*w2);
i=0;
if (l1<0)i=i+1;
if (l2>0)i=i+1;
if (i==2)l1=0;
if (i==2)l2=(w2-tr)/(2*w2);
i=0;
if (l1>0)i=i+1;
if (l2<0)i=i+1;
if (i==2)l1=(w1-tr)/(2*w1);
if (i==2)l2=0;
c1=w1*l1+w2*l2+tr;
b1=b1+th1[s1]*l1+th2[s2]*l2-c1;
}
}
return b1;
}
static double wel(double tk,double tl,double tr,double th1[],double th2[]){
double we,w1,w2,l1,l2,c1;
int s1,s2,i;
we=0;
for (s1=1;s1<11;s1++){
for (s2=1;s2<11;s2++){
w1=(1-tk)*th1[s1];
w2=(1-tl)*th2[s2];
l1=1-(w1+w2+tr)/(3*w1);
l2=1-(w1+w2+tr)/(3*w2);
i=0;
if (l1<0)i=i+1;
if (l2>0)i=i+1;
if (i==2)l1=0;
if (i==2)l2=(w2-tr)/(2*w2);
i=0;
if (l1>0)i=i+1;
if (l2<0)i=i+1;
if (i==2)l1=(w1-tr)/(2*w1);
if (i==2)l2=0;
c1=w1*l1+w2*l2+tr;
we=we+Math.log(c1)+Math.log(1-l1)+Math.log(1-l2);
}
}
return we;
}
static double trs(double tk,double tl,double[] th1,double[] th2){
double tr1,tr2,tr3,b1,b2;
int t1;
tr1=0.1;
tr2=0.05;
b1=bud(tk,tl,tr1,th1,th2);
t1=0;
while(t1<100){
b2=bud(tk,tl,tr2,th1,th2);
tr3=tr2-b2*(tr2-tr1)/(b2-b1);
b1=b2;
tr1=tr2;
tr2=tr3;
if (b2*b2<0.001)t1=1000;
t1=t1+1;
}
return tr2;
}
static double ux(double c1,double l1,double l2){
int pp;
double u1,cp1,lp1,lp2;
pp=0;
cp1=c1;
lp1=l1;
lp2=l2;
if (lp1<0)pp=100;
if (lp1>0.99)pp=100;
if (lp2<0)pp=100;
if (lp2>0.99)pp=100;
if (pp>50)lp1=0.5;
if (pp>50)lp2=0.5;
u1=Math.log(cp1)+Math.log(1-lp1)+Math.log(1-lp2);
if (pp>50)u1=-999;
return u1;
}
static double mlx(int s1,int s2,double tk,double tl,double tr,double[] th1,double th2[]){
int i;
double w1,w2,l1,l2;
w1=(1-tk)*th1[s1];
w2=(1-tl)*th2[s2];
l1=1-(w1+w2+tr)/(3*w1);
l2=1-(w1+w2+tr)/(3*w2);
i=0;
if (l1<0)i=i+1;
if (l2>0)i=i+1;
if (i==2)l1=0;
if (i==2)l2=(w2-tr)/(2*w2);
i=0;
if (l1>0)i=i+1;
if (l2<0)i=i+1;
if (i==2)l1=(w1-tr)/(2*w1);
if (i==2)l2=0;
return l1;
}
static double flx(int s1,int s2,double tk,double tl,double tr,double[] th1,double th2[]){
int i;
double w1,w2,l1,l2;
w1=(1-tk)*th1[s1];
w2=(1-tl)*th2[s2];
l1=1-(w1+w2+tr)/(3*w1);
l2=1-(w1+w2+tr)/(3*w2);
i=0;
if (l1<0)i=i+1;
if (l2>0)i=i+1;
if (i==2)l1=0;
if (i==2)l2=(w2-tr)/(2*w2);
i=0;
if (l1>0)i=i+1;
if (l2<0)i=i+1;
if (i==2)l1=(w1-tr)/(2*w1);
if (i==2)l2=0;
return l2;
}
}
最終更新:2010年06月04日 05:55