HDU1078FatMouse and Cheese(记忆化搜索)

题目大意:给你一张n*n的图,每点位置输入一个值,给你一个k表示每次能够走的最大步数,然后走图路径的值为该情况的一条累和最大的递增序列,并输出这个最大值

解题思路:类似于三角形之和的动态规划的题目,由于是一张图,此时用记忆化搜索,出口是当你发现四个方向没有比自己本身再大的数,这里不用一个book保存该条搜索方向已走过的方向,也就是不怕他死循环,因为你走过的路径分别的值一定比你当前位置以及之后要走的来得小,一开始想写在终点保存最优值一直没写得出来(这点暂时还没想好怎么改,一直WA,注:可能状态定义也有点问题,因为从前面加到当前的最优值不一定是整体的最优值(这一点不一定对,可以忽略,参考算法竞赛入门经典训练指南 的三角形之和3得到的思路)),就用起点dp保存最优值,相当于dfs函数是找到(i,j)点之后的一条最优值路线的所有值的和

AC代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
using namespace std;

int map[110][110],k,n,aa[4][2]={0,1,1,0,0,-1,-1,0},dp[110][110];

bool pan(int x,int y)
{
	if(x<0||x>n-1||y<0||y>n-1)
		return false;
	return true;
}

int dfs(int x,int y)
{
	if(dp[x][y])
		return dp[x][y];
	int i,a,b,j,MAX=0,s;
	for(i=0;i<4;i++)
	{
		for(j=1;j<=k;j++)
		{
			a=x+aa[i][0]*j;
			b=y+aa[i][1]*j;
			if(pan(a,b) && map[a][b]>map[x][y])
			{
				s=dfs(a,b);
				if(MAX<s)
					MAX=s;
			}
		}
	}
	dp[x][y]=MAX+map[x][y];
	return dp[x][y];
}

int main()
{
	int i,j;
	while(~scanf("%d%d",&n,&k) && (n!=-1 || k!=-1))
	{
		memset(dp,0,sizeof(dp));
		for(i=0;i<n;i++)
		for(j=0;j<n;j++)
		scanf("%d",&map[i][j]);
		dfs(0,0);
		printf("%d\n",dp[0][0]);
	}
	return 0;
}

全部评论

相关推荐

05-11 11:48
河南大学 Java
程序员牛肉:我是26届的双非。目前有两段实习经历,大三上去的美团,现在来字节了,做的是国际电商的营销业务。希望我的经历对你有用。 1.好好做你的CSDN,最好是直接转微信公众号。因为这本质上是一个很好的展示自己技术热情的证据。我当时也是烂大街项目(网盘+鱼皮的一个项目)+零实习去面试美团,但是当时我的CSDN阅读量超百万,微信公众号阅读量40万。面试的时候面试官就告诉我说觉得我对技术挺有激情的。可以看看我主页的美团面试面经。 因此花点时间好好做这个知识分享,最好是单拉出来搞一个板块。各大公司都极其看中知识落地的能力。 可以看看我的简历对于博客的描述。这个帖子里面有:https://www.nowcoder.com/discuss/745348200596324352?sourceSSR=users 2.实习经历有一些东西删除了,目前看来你的产出其实很少。有些内容其实很扯淡,最好不要保留。有一些点你可能觉得很牛逼,但是面试官眼里是减分的。 你还能负责数据库表的设计?这个公司得垃圾成啥样子,才能让一个实习生介入数据库表的设计,不要写这种东西。 一个公司的财务审批系统应该是很稳定的吧?为什么你去了才有RBAC权限设计?那这个公司之前是怎么处理权限分离的?这些东西看着都有点扯淡了。 还有就是使用Redis实现轻量级的消息队列?那为什么这一块不使用专业的MQ呢?为什么要使用redis,这些一定要清楚, 就目前看来,其实你的这个实习技术还不错。不要太焦虑。就是有一些内容有点虚了。可以考虑从PR中再投一点产出
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务