【解題報告】洛谷P7074 方格取數
阿新 • • 發佈:2021-10-11
【解題報告】洛谷P7074 方格取數
題目連結
https://www.luogu.com.cn/problem/P7074
思路
這道題目就是從 \((1,1)\) 開始隨便走,不走重複的,只能向上向右和向下走一個,走到 \((n,m)\) ,問可以取到的最大是多少
乍一眼看過去跟之前的方格取數很像,實際上不一樣
因為這裡可以從下面轉移過來,怎麼辦呢?
我們設 \(f[i][j][0/1]\) 表示從 \((1,1) \rightarrow (i,j)\) 的最大值 ,其中 \(0,1\) 分別表示從上方走過來,從下方走過來
於是我們進行一個記憶化搜尋,就可以過了
這裡重要的點在於設定狀態,因為這道題目主要與眾不同的地方就在於可以從下方轉移過來
本博文為wweiyi原創,若想轉載請聯絡作者,qq:2844938982#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; }