POJ 2353 Ministry(双向DP)

来源:互联网 发布:淘宝客都是怎么推广的 编辑:程序博客网 时间:2024/05/16 09:33
/*题意:矩形M*N,要求:只能向下、向左、向右走,求从第一层到最后一层费用最小的路径。思路:双向DP(其实就是两个for循环),因为最佳路径只有三种从上、从左、从右,所以只需要三个循环即可原来使用Dijskra中寻找最短路径的方法,果断超时!*/#include <cstdio>#include <cstring>const int mMax = 107;const int nMax = 507;int map[mMax][nMax];__int64 d[nMax];int dir[mMax][nMax];int M, N;void print(int x, int y){if(dir[x][y] == 0)print(x - 1, y);else if(dir[x][y] == 1)print(x, y - 1);else if(dir[x][y] == 2)print(x, y + 1);printf("%d\n", y + 1);}int main(){while(scanf("%d%d", &M, &N) != EOF){int i, j;for(i = 0; i < M; ++ i){for(j = 0; j < N; ++ j)scanf("%d", &map[i][j]);}for(j = 0; j < N; ++ j) d[j] = map[0][j], dir[0][j] = -1;for(i = 1; i < M; ++ i){for(j = 0; j < N; ++ j) d[j] = d[j] + map[i][j], dir[i][j] = 0;for(j = 1; j < N; ++ j){if(d[j] > d[j - 1] + map[i][j])d[j] = d[j - 1] + map[i][j], dir[i][j] = 1;}for(j = N - 2; j >= 0; -- j){if(d[j] > d[j + 1] + map[i][j])d[j] = d[j + 1] + map[i][j], dir[i][j] = 2;}}int _max = 0;for(j = 1; j < N; ++ j){if(d[j] < d[_max])_max = j;}print(M - 1, _max);}return 0;}

原创粉丝点击