动态规划-记忆化搜索

来源:互联网 发布:佛山数控编程培训机构 编辑:程序博客网 时间:2024/05/16 14:42

刘汝佳第九章–动态规划–数学三角形问题
题目大意:有一个由非负整数组成的三角形,第一行只有一个数,除了最下行之外每个数的的左下方和右下方各有一个数。从第一行的数开始,每次可以往左下或右下走一格,直到走到最下行,把沿途经过的数全部加起来,如何走才能使这个数最大?
1
3 2
4 10 1
4 3 2 20

#include <cstdio>#include <algorithm>#include <cstring>using namespace std;int i[105][105];int j[105][105];int n;int num=0;int dfs(int a,int b){    num++;    if(j[a][b]>=0)        return j[a][b];    return j[a][b]=i[a][b]+(a==n?0:max(dfs(a+1,b),dfs(a+1,b+1)));}int main(){    while(~scanf("%d",&n))    {        num=0;        for(int a = 1; a <= n; a ++)        {            for(int b = 1; b <= a; b ++)                scanf("%d",&i[a][b]);        }        memset(j,-1,sizeof(j));        printf("%d\n",dfs(1,1));        printf("num的值为%d\n",num);    }    return 0;}
原创粉丝点击