zoukankan      html  css  js  c++  java
  • Explorer Space

    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;
    }
    
    CAD加油!欢迎跟我一起讨论学习算法,QQ:1401650042
  • 相关阅读:
    web.xml配置详解
    oracle按时间创建分区表
    cron表达式详解
    临时表
    配置非安装版tomcat服务
    CodeForces 785 D Anton and School
    CodeForces 601B Lipshitz Sequence
    CodeForces 590C Three States BFS
    CodeForces 592D Super M DP
    CodeForces 507E Breaking Good 2维权重dij
  • 原文地址:https://www.cnblogs.com/cader/p/14702654.html
Copyright © 2011-2022 走看看