比较值得说的是 如果脑子里确实有很明确的递推图(注意是图,根据递推式演变来的二维矩阵(也许三维),或者一维的"类"有向图)那么递推写起来快得多。否则还是记忆化搜索保险。
1.但是跟所有动规问题类似,务必注意边界,建议把第一条横边(i = 0 0<j<N ) && 竖边( j = 0 0<i<N ) 单独提取出来赋值。
2.注意边界的同时,更要注意起始点的赋值 map[0][0] = input[0][0]
3.以及输出的结果应该为 map[N-1][N-1] 而非 map[N][N]
#include <stdio.h> int input[1010][1010]; int map[1010][1010]; int min(int a, int b) { return a<b?a:b; } int main() { int N; int i, j; while(scanf("%d", &N) == 1) { for(i = 0; i < N; i++) { for(j = 0; j < N; j++) scanf("%d", &input[i][j]); } map[0][0] = input[0][0]; for(j = 1; j < N ;j++) map[0][j] = map[0][j-1] + input[0][j];
for(i = 1; i < N; i++) map[i][0] = map[i-1][0] + input[i][0]; for(i = 1; i < N; i++) { for(j = 1; j < N; j++) { map[i][j] = min(map[i-1][j], map[i][j-1]) + input[i][j]; } } printf("%d ", map[N-1][N-1]); } return 0; }
http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1147