标签:dfs lan test 搜索 lock ted main 递推 ==
一点一点把题目理顺。看看哪些是可以推断出来的。
对于 dp 的题目而言,要一点一点去分析其中什么东西是可以递推的,正如这道题中
\(dp[x][y][k]=min\{dp[xx][yy][k-1]+d[x][y][i]\}\)
然后再进行记忆化搜索即可。
// Created by CAD
#include <bits/stdc++.h>
#define INF 0x7fffffffffffffff
#define ll long long
using namespace std;
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
int d[505][505][4];
ll dp[505][505][15];
int n,m;
ll dfs(int x,int y,int k){
if(k==0) return 0;
if(dp[x][y][k]) return dp[x][y][k];
ll ans=INF;
for(int i=0;i<4;++i){
int xx=x+dx[i],yy=y+dy[i];
if(xx>n||xx<1||yy<1||yy>m) continue;
ans=min(ans,dfs(xx,yy,k-1)+d[x][y][i]);
}
return dp[x][y][k]=ans;
}
ll solve(int x,int y,int k){
if(k&1) return -1;
else return dfs(x,y,k/2)*2;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int k;cin>>n>>m>>k;
for(int i=1;i<=n;++i){
for(int j=1;j<=m-1;++j){
int x;cin>>x;
d[i][j][0]=d[i][j+1][1]=x;
}
}
for(int i=1;i<n;++i){
for(int j=1;j<=m;++j){
int x;cin>>x;
d[i][j][2]=d[i+1][j][3]=x;
}
}
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j)
cout<<solve(i,j,k)<<" \n"[j==m];
}
return 0;
}
标签:dfs lan test 搜索 lock ted main 递推 ==
原文地址:https://www.cnblogs.com/CADCADCAD/p/14702654.html