- 问答
- 2009-07-22 22:12:15 @
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 条评论
-
TLD LV 10 @ 2009-07-22 22:12:15
dp的方向有好几个呀
- 1