Explorer Space

D. Explorer Space

一点一点把题目理顺。看看哪些是可以推断出来的。

对于 dp 的题目而言,要一点一点去分析其中什么东西是可以递推的,正如这道题中

dp[x][y][k]=min{dp[xx][yy][k1]+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;
}
posted @   caoanda  阅读(123)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
历史上的今天:
2020-04-25 Android从文件中读入数据
2020-04-25 Android新建文件夹
2020-04-25 弹出提示信息
2020-04-25 Android自定义弹出窗口
2020-04-25 Android实现页面跳转
2020-04-25 获取SD卡的读写权限
2020-04-25 Button设定点击事件
点击右上角即可分享
微信分享提示