您的位置:首页 > 其它

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

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

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

#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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: