/ Vijos / 讨论 / 问答 /

vijos1006望解答左右各扫两遍问题

AC了,但是不解

为什么要左右各扫两遍,而不是左右各一遍呢?

我是由i推到i+1(向外推),和由i-1推到i(盯着i推)有何区别?

#include

#include

#include

int n;

int h[1001][1001];

int f[1001][1001];

int main(void)

{

int i,j,p;

//freopen("t","r",stdin);

scanf("%d",&n);

for(i=1;if[i][j]+h[j-1])

f[j-1]=f[i][j]+h[j-1];

// if(f[j-1]==13)printf("a");

}

if(j-1==0){//left

if(f[i][i]>f[i][j]+h[i][i])

f[i][i]=f[i][j]+h[i][i];

}

else{

if(f[i][j-1]>f[i][j]+h[i][j-1])

f[i][j-1]=f[i][j]+h[i][j-1];

}

if(j==i){//right

if(f[i][1]>f[i][j]+h[i][1])

f[i][1]=f[i][j]+h[i][1];

}

else{

if(f[i][j+1]>f[i][j]+h[i][j+1])

f[i][j+1]=f[i][j]+h[i][j+1];

}

}

for(j=i;j>=1;j--)

if(f[i][j]!=INT_MAX){

if(j==i){//right-up

if(f[1]>f[i][j]+h[1])

f[1]=f[i][j]+h[1];

}

else{

if(f[j]>f[i][j]+h[j])

f[j]=f[i][j]+h[j];

}

if(j-1==0){//left-up

if(f>f[i][j]+h)

f=f[i][j]+h;

//if(f[j-1]==13)printf("a");

}

else{

if(f[j-1]>f[i][j]+h[j-1])

f[j-1]=f[i][j]+h[j-1];

// if(f[j-1]==13)printf("a");

}

if(j-1==0){//left

if(f[i][i]>f[i][j]+h[i][i])

f[i][i]=f[i][j]+h[i][i];

}

else{

if(f[i][j-1]>f[i][j]+h[i][j-1])

f[i][j-1]=f[i][j]+h[i][j-1];

}

if(j==i){//right

if(f[i][1]>f[i][j]+h[i][1])

f[i][1]=f[i][j]+h[i][1];

}

else{

if(f[i][j+1]>f[i][j]+h[i][j+1])

f[i][j+1]=f[i][j]+h[i][j+1];

}

}

}

}

/*

for(i=1;i

1 条评论

  • @ 2009-07-22 22:12:15

    dp的方向有好几个呀

  • 1