动态规划____数塔 递推方法(以前都是记忆化搜索)

比较值得说的是 如果脑子里确实有很明确的递推图(注意是图,根据递推式演变来的二维矩阵(也许三维),或者一维的"类"有向图)那么递推写起来快得多。否则还是记忆化搜索保险。

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\n", map[N-1][N-1]); } return 0; }

http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1147

posted on 2013-07-02 23:54  wwjyt  阅读(235)  评论(0编辑  收藏  举报