码迷,mamicode.com
首页 > 其他好文 > 详细

P1216数字三角形

时间:2019-10-12 20:27:35      阅读:77      评论:0      收藏:0      [点我收藏+]

标签:else   复杂度   lse   记忆   枚举   ==   有关   没有   int   

这是USACO的一道记忆化搜索题,还记得原来学搜索就是被此所困。

给定n深的数,第i层有i个节点,存储有一个数字,询问从第一层走到最后一层所经过节点上数字和的最大值。我们很容易想到枚举所有路径来计算最大值,但这是2^n的复杂度,显然,对于固定的x,y的返回值是一定的,与上面怎么走过来的没有关系,所以会造成重复统计,所以我们要想办法进行优化。发现每个点只于下面的左子树最大值与右子树最大值有关,所以我们要做的就是再开一个f[][]数组记忆每一个点的最大值,如果被标记为已经记忆,即f数据被修改了,那么直接返回即可;如果没有修改,那么则累加下面的最大值即可。

dfs代码

int dfs(int x,int y){
    if(x==n) return mp[x][y];
    else return mp[x][y]+max(dfs(x+1,y),dfs(x+1,y+1))        
}
int ans=dfs(1,1);

 

记忆化搜索代码

void dfs(int x,int y){
    if(f[x][y]!=0) return f[x][y];
    if(x==n) return  mp[x][y];
    else  return  f[x][y]=mp[x][y]+max(dfs(x+1,y),dfs(x+1,y+1));
}

 

P1216数字三角形

标签:else   复杂度   lse   记忆   枚举   ==   有关   没有   int   

原文地址:https://www.cnblogs.com/china-mjr/p/11663486.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!