码迷,mamicode.com
首页 > 其他好文 > 详细

Explorer Space

时间:2021-04-27 14:17:50      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:dfs   lan   test   搜索   lock   ted   main   递推   ==   

D. Explorer Space

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

对于 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;
}

Explorer Space

标签:dfs   lan   test   搜索   lock   ted   main   递推   ==   

原文地址:https://www.cnblogs.com/CADCADCAD/p/14702654.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!