zoukankan      html  css  js  c++  java
  • HackerRank

    This is my 1st 3D DP problem, and it should be an educational one. But, still tricky to me.
    Here is a good article: http://www.cnblogs.com/sunshineatnoon/p/3919423.html, and I simply re-code it in C++, for learning :)

    #include <cmath>
    #include <cstdio>
    #include <vector>
    #include <map>
    #include <set>
    #include <unordered_set>
    #include <string>
    #include <climits>
    #include <iostream>
    #include <algorithm>
    #include <unordered_map>
    #include <unordered_set>
    using namespace std;
    
    int CalcMin(int i, int j, int k,
        vector<vector<vector<int>>> &dp,
        vector<string> &map)
    {
        int min_mv = INT_MAX - 1;
        int n = map.size();
        int m = map[0].size();
    
        if (i - 1 >= 0)
        {
            int newMv = dp[i - 1][j][k - 1] + (map[i - 1][j] == 'D' ? 0 : 1);
            min_mv = std::min(min_mv, newMv);
        }
        if (i + 1 < n)
        {
            int newMv = dp[i + 1][j][k - 1] + (map[i + 1][j] == 'U' ? 0 : 1);
            min_mv = std::min(min_mv, newMv);
        }
        if (j - 1 >= 0)
        {
            int newMv = dp[i][j - 1][k - 1] + (map[i][j - 1] == 'R' ? 0 : 1);
            min_mv = std::min(min_mv, newMv);
        }
        if (j + 1 < m)
        {
            int newMv = dp[i][j + 1][k - 1] + (map[i][j + 1] == 'L' ? 0 : 1);
            min_mv = std::min(min_mv, newMv);
        }
        return min_mv;
    }
    
    int main()
    {
        int n, m, K;
        cin >> n >> m >> K;
    
        int sx, sy;
    
        vector<string> map;
        for (int i = 0; i < n; i++)
        {
            char buf[60] = { 0 };
            scanf("%s", buf);
            string s(buf);
            size_t inx;
            if ((inx = s.find('*')) != string::npos)
            {
                sx = i;
                sy = inx;
            }
            map.push_back(s);
        }
    
        //
        vector<vector<vector<int>>> dp(n, vector<vector<int>>(m, vector<int>(K + 1)));
        for (int k = 0; k <= K; k++)
        for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
        {
            if (k == 0)    // INIT
            {
                dp[i][j][k] = ((i + j) == 0) ? 0 : INT_MAX - 1;
            }
            else
            {
                dp[i][j][k] = CalcMin(i, j, k, dp, map);
            }
        }
    
        //    Get Min
        int ret = INT_MAX - 1;
        for (int k = 0; k <= K; k++)
            ret = std::min(ret, dp[sx][sy][k]);
    
        cout << (ret == (INT_MAX - 1) ? -1 : ret) << endl;
        return 0;
    }
  • 相关阅读:
    Petapoco 数据库操作类
    .net Cookie操作公共方法 CookieHelper
    .net 服务端缓存 Cache/CacheHelper
    Base64加密解密方法
    对多字段进行去重 ( Linq 方式 )
    BootStrap之 提示工具(Tooltip)插件
    bootstrap之弹出框
    Jquery 强大的表单验证操作
    强大的数据库工具 dbForge Studio ForMySql
    My操作小技巧
  • 原文地址:https://www.cnblogs.com/tonix/p/4506132.html
Copyright © 2011-2022 走看看