class pro{
public static void main(String args[]){
int m,s,n1,n2,m1,m2,mx1,mx2,nx1,nx2,s1;
double h,cost;
double[] th=new double[101];
double[] x=new double[101];
double[] px=new double[101];
double[][][] rev=new double[101][3][3];
double[][][] u=new double[101][3][3];
double[][][] w=new double[101][3][3];
double[][][] v=new double[101][3][3];
int[][][] gotop=new int[101][3][3];
int[][][] gotox=new int[101][3][3];
double[][][] vs=new double[101][3][3];
int[] opp=new int[101];
int[] opx=new int[101];
double p,r1,maxrev,maxp,v1;
double maxv;
double p1,x1,u1;
double ep;
double dp,dx;
int t1,t2;
for (s=1;s<101;s++){
th[s]=s;
}
maxrev=-999;
maxp=0;
for (m=0;m<41;m++){
p=m;
r1=rev(th,p);
if (r1>maxrev)maxp=p;;
if (r1>maxrev)maxrev=r1;
}
p=maxp;
for (s=1;s<101;s++){
x[s]=d(s,th,p);
}
for (s=1;s<101;s++){
px[s]=p*x[s];
}
cost=5;
h=0.2;
t2=0;
while(t2<10){
h=h/2;
t1=0;
while(t1<100){
for (s=1;s<101;s++){
for (n1=-1;n1<2;n1++){
for (n2=-1;n2<2;n2++){
p1=px[s]+n1*h;
x1=x[s]+n2*h;
r1=p1-cost*x1;
if (x1<0)r1=-999;
u1=th[s]*Math.log(x1+1)-p1;
if (u1<0)r1=-999;
rev[s][n1+1][n2+1]=r1;
}
}
}
for (s=1;s<101;s++){
for (n1=-1;n1<2;n1++){
for (n2=-1;n2<2;n2++){
p1=px[s]+n1*h;
x1=x[s]+n2*h;
u1=th[s]*Math.log(x1+1)-p1;
if (u1<0)u1=-999;
u[s][n1+1][n2+1]=u1;
}
}
}
for (s=1;s<100;s++){
for (n1=-1;n1<2;n1++){
for (n2=-1;n2<2;n2++){
p1=px[s]+n1*h;
x1=x[s]+n2*h;
u1=th[s+1]*Math.log(x1+1)-p1;
if (u1<0)u1=-999;
w[s][n1+1][n2+1]=u1;
}
}
}
s=1;
for (n1=-1;n1<2;n1++){
for (n2=-1;n2<2;n2++){
v[s][n1+1][n2+1]=rev[s][n1+1][n2+1];
}
}
for (s=2;s<101;s++){
for (n1=-1;n1<2;n1++){
for (n2=-1;n2<2;n2++){
r1=rev[s][n1+1][n2+1];
u1=u[s][n1+1][n2+1];
maxv=-999;
mx1=0;
mx2=0;
for (m1=-1;m1<2;m1++){
for (m2=-1;m2<2;m2++){
v1=r1+v[s-1][m1+1][m2+1];
if (w[s-1][m1+1][m2+1]>u1)v1=-999;
if (v1>maxv)mx1=m1;
if (v1>maxv)mx2=m2;
if (v1>maxv)maxv=v1;
}
}
gotop[s][n1+1][n2+1]=mx1;
gotox[s][n1+1][n2+1]=mx2;
v[s][n1+1][n2+1]=maxv;
}
}
}
maxv=-999;
nx1=0;
nx2=0;
for (n1=-1;n1<2;n1++){
for (n2=-1;n2<2;n2++){
v1=v[100][n1+1][n2+1];
if (v1>maxv)nx1=n1;
if (v1>maxv)nx2=n2;
if (v1>maxv)maxv=v1;
}
}
opp[100]=nx1;
opx[100]=nx2;
opp[99]=gotop[100][nx1+1][nx2+1];
opx[99]=gotox[100][nx1+1][nx2+1];
for (s1=1;s1<99;s1++){
s=100-s1;
opp[s-1]=gotop[s][opp[s]+1][opx[s]+1];
opx[s-1]=gotox[s][opp[s]+1][opx[s]+1];
}
ep=0;
for (s=1;s<101;s++){
ep=ep+Math.pow(opp[s],2)+Math.pow(opx[s],2);
}
System.out.println(ep);
for (s=1;s<101;s++){
x[s]=x[s]+h*opx[s];
px[s]=px[s]+h*opp[s];
}
if (ep<2)t1=1000;
t1=t1+1;
}
t2=t2+1;
}
for (s=1;s<100;s++){
dx=x[s+1]-x[s];
dp=px[s+1]-px[s];
if (dx>0) System.out.println(dp/dx);
}
}
static double rev(double[] th,double p){
double x1,r1,cost;
int s;
cost=5;
r1=0;
for (s=1;s<101;s++){
x1=d(s,th,p);
r1=r1+(p-cost)*x1;;
}
return r1;
}
static double d(int s,double[] th,double p){
double x1;
x1=th[s]/p-1;
if(x1<0)x1=0;
return x1;
}
}
最終更新:2010年01月29日 19:28