package optimal;
public class pro {
double[][][] u=new double[101][21][21];
double[][][] w=new double[101][21][21];
double[][][][] v=new double[101][21][21][101];
int[][][][] gotom=new int[101][21][21][101];
int[][][][] goton=new int[101][21][21][101];
int[][][][] gotob=new int[101][21][21][101];
int[] c=new int[101];
int[] y=new int[101];
int[] th=new int[101];
int[] opc=new int[101];
int[] opy=new int[101];
int[][] endm=new int[21][21];
int[][] endn=new int[21][21];
int[][] endb=new int[21][21];
double h;
int s,m,n,b,bx;
int c1,y1;
public static void main(String[] args) {
pro test=new pro();
}
pro(){
for(s=1;s<101;s++){
th[s]=10*s;
}
h=0.01;
for(s=1;s<101;s++){
for(m=-10;m<11;m++){
for(n=-10;n<11;n++){
c1=c[s]+m;
y1=y[s]+n;
u[s][m+10][n+10]=ux(s,c1,y1);
}
}
}
for(s=1;s<100;s++){
for(m=-10;m<11;m++){
for(n=-10;n<11;n++){
c1=c[s]+m;
y1=y[s]+n;
w[s][m+10][n+10]=ux(s+1,c1,y1);
}
}
}
s=1;
for(m=-10;m<11;m++){
for(n=-10;n<11;n++){
for(b=-50;b<51;b++){
v[s][m+10][n+10][b+50]=-999;
}
}
}
s=1;
for(m=-10;m<11;m++){
for(n=-10;n<11;n++){
b=n-m;
v[s][m+10][n+10][b+50]=u[s][m+10][n+10];
}
}
double u1,maxv,v1,w1;
int z,mx,nx,mxs,nxs,bxs;
for(s=2;s<10;s++){
for(m=-10;m<11;m++){
for(n=-10;n<11;n++){
for(b=-50;b<51;b++){
u1=u[s][m+10][n+10];
bx=b-n+m;
z=0;
if(bx<-50)z=100;
if(bx>50)z=100;
if(z>50)bx=0;
maxv=-999;
mxs=0;
nxs=0;
bxs=0;
for(mx=-10;mx<11;mx++){
for(nx=-10;nx<11;nx++){
v1=u1+v[s-1][mx+10][nx+10][bx+50];
w1=w[s-1][mx+10][nx+10];
if(w1>u1)v1=-999;
if(z>50)v1=-999;
if(v1>maxv)mxs=mx;
if(v1>maxv)nxs=nx;
if(v1>maxv)bxs=bx;
if(v1>maxv)maxv=v1;
}
}
v[s][m+10][n+10][b+50]=maxv;
gotom[s][m+10][n+10][b+50]=mxs;
goton[s][m+10][n+10][b+50]=nxs;
gotob[s][m+10][n+10][b+50]=bxs;
}
}
}
}
double supv;
int ms,ns,bs;
s=100;
supv=-999;
ms=0;
ns=0;
for(m=-10;m<11;m++){
for(n=-10;n<11;n++){
u1=u[s][m+10][n+10];
bx=m-n;
maxv=-999;
mxs=0;
nxs=0;
bxs=0;
for(mx=-10;mx<11;mx++){
for(nx=-10;nx<11;nx++){
v1=u1+v[s-1][mx+10][nx+10][bx+50];
w1=w[s-1][mx+10][nx+10];
if(w1>u1)v1=-999;
if(v1>maxv)mxs=mx;
if(v1>maxv)nxs=nx;
if(v1>maxv)bxs=bx;
if(v1>maxv)maxv=v1;
}
}
endm[m+10][n+10]=mxs;
endn[m+10][n+10]=nxs;
endb[m+10][n+10]=bxs;
if(maxv>supv)ms=m;
if(maxv>supv)ns=n;
if(maxv>supv)supv=maxv;
}
}
System.out.println(ms);
System.out.println(ns);
opc[100]=ms;
opy[100]=ns;
bs=ms-ns;
mxs=endm[ms+10][ns+10];
nxs=endn[ms+10][ns+10];
opc[99]=mxs;
opy[99]=nxs;
int t;
for(t=1;t<99;t++){
ms=opc[100-t];
ns=opy[100-t];
opc[99-t]=gotom[100-t][ms+10][ns+10][bs+50];
opy[99-t]=goton[100-t][ms+10][ns+10][bs+50];
bs=bs-opc[99-t]+opy[99-t];
}
for(s=1;s<101;s++){
c[s]=c[s]+opc[s];
y[s]=y[s]+opy[s];
}
}
double ux(int s,int c1,int y1){
double c2,x2,u1;
int z;
c2=c1*h;
x2=1-(double)y1/th[s];
z=0;
if(c2<0)z=100;
if(x2<0)z=100;
if(x2>1)z=100;
u1=-999;
if(z<50)u1=Math.log(c2)+Math.log(x2);
return u1;
}
}
最終更新:2013年09月24日 01:10