HDU 1078 FatMouse and Cheese (dp)

本文介绍了一个使用动态规划解决的网格路径问题。在一个n*n的网格中,每个格子都有一个权值,目标是在遵循特定规则下找到从起点到终点的路径,使得路径上的权值和最大。具体规则包括:每次移动只能沿横竖方向,当前格的权值必须比上一格大,且每次移动的距离不能超过k。文章详细解释了动态规划的思路,并提供了完整的C++代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目大意:

在一个n*n的网格中,每个格子中有一个权值,要求每次只能沿横竖方向走且当前格的权值要比上一格大,另外每次横竖移动的最大距离不能超过k

思路:

dp[i][j]表示到(i,j)的最大权值和

dp[i][j] = max{dp[i + m][j + m] | abs(m) <= k && g[i + m][j + m] > g[i][j] } + g[i][j]

代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=110;
int d[maxn][maxn],g[maxn][maxn];
int n,m;
int dp(int x,int y)
{
	if(d[x][y]>0) return d[x][y];
	int val = g[x][y];
	int temp = val;
	for(int i=x-m;i<=x+m&&i<n;i+=1)
	{
		if(i<0) continue;
		if(g[x][y]<g[i][y]) temp=max(temp,val+dp(i,y));
	}
	for(int i=y-m;i<=y+m&&i<n;i+=1)
	{
		if(i<0) continue;
		if(g[x][y]<g[x][i]) temp=max(temp,val+dp(x,i));
	}
	return d[x][y]=temp;
}
int main()
{
	while(~scanf("%d%d",&n,&m))
	{
		if(n==-1) break;
		memset(g,0,sizeof(g));
		memset(d,0,sizeof(d));
		for(int i=0;i<n;i++)
		{
			for(int j=0;j<n;j++)
			{
				scanf("%d",&g[i][j]);
			}
		}		
		int ans=dp(0,0);
		printf("%d\n",ans);
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值