【解题报告】洛谷P7074 方格取数

【解题报告】洛谷P7074 方格取数

题目链接

https://www.luogu.com.cn/problem/P7074

思路

这道题目就是从 \((1,1)\) 开始随便走,不走重复的,只能向上向右和向下走一个,走到 \((n,m)\) ,问可以取到的最大是多少

乍一眼看过去跟之前的方格取数很像,实际上不一样

因为这里可以从下面转移过来,怎么办呢?

我们设 \(f[i][j][0/1]\) 表示从 \((1,1) \rightarrow (i,j)\) 的最大值 ,其中 \(0,1\) 分别表示从上方走过来,从下方走过来

于是我们进行一个记忆化搜索,就可以过了

这里重要的点在于设置状态,因为这道题目主要与众不同的地方就在于可以从下方转移过来

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
#define int long long
using namespace std;
const int maxn=1005;
const int INF=1e9;
int n,m;
int a[maxn][maxn];
int f[maxn][maxn][5];
bool vis[maxn];
int dfs(int i,int j,int from)
{
	if(i<1||j<1||i>n||j>m) return -INF;
	if(f[i][j][from]!=-INF) 
	return f[i][j][from];
	if(from==0)
	f[i][j][from]=max(dfs(i+1,j,0),max(dfs(i,j-1,0),dfs(i,j-1,1)))+a[i][j];
	else
	f[i][j][from]=max(dfs(i-1,j,1),max(dfs(i,j-1,0),dfs(i,j-1,1)))+a[i][j];
	return f[i][j][from];
}
signed main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		cin>>a[i][j];
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		f[i][j][0]=f[i][j][1]=-INF;
	}
	f[1][1][0]=f[1][1][1]=a[1][1];
	cout<<dfs(n,m,1)<<'\n';
	return 0;
}
上一篇:Matlab航迹规划仿真——A*算法


下一篇:Idea 创建 web.xml 文件