美文网首页
滑雪场最长路径问题

滑雪场最长路径问题

作者: IT孤独者 | 来源:发表于2016-12-30 17:12 被阅读0次
问题

解法很简单,遍历求解每个元素的最长深度,有点类似图的深度遍历算法,但是还是有些不同,
另外,需要有个中间表用来记录已经计算过的节元素的深度,提高运行效率, 算法并不是最优的,比如说,如果某个节点计算过了就不要重复计算了

#include <iostream>
#include <vector>
using namespace std;

void Output(const vector<vector<int> > & vecMatrix)
{
    for (auto itr=vecMatrix.begin();
          itr!=vecMatrix.end();
          ++itr)
    {
        for (auto itr2=itr->begin();
              itr2!=itr->end();
              ++itr2)
        {
            cout << *itr2 << " ";
        }
        cout << endl;
    }
}

void CalculateLength(const vector<vector<int> > & vecMatrix,
        vector<vector<int> > & vecLength,
        int i,
        int j,
        int R,
        int C)
{
    int nLeft  = 0;
    int nRight = 0;
    int nTop   = 0;
    int nDown  = 0;

    if (j-1 >= 0 && vecMatrix[i][j-1] < vecMatrix[i][j]) {
        if (vecLength[i][j-1] == 0) {
            CalculateLength(vecMatrix, vecLength, i, j-1, R, C);
        }
        nLeft = vecLength[i][j-1];
    }
    if (j+1 < C && vecMatrix[i][j+1] < vecMatrix[i][j]) {
        if (vecLength[i][j+1] == 0) {
            CalculateLength(vecMatrix, vecLength, i, j+1, R, C);
        }
        nRight = vecLength[i][j+1];
    }
    if (i-1 >= 0 && vecMatrix[i-1][j] < vecMatrix[i][j]) {
        if (vecLength[i-1][j] == 0) {
            CalculateLength(vecMatrix, vecLength, i-1, j, R, C);
        }
        nTop = vecLength[i-1][j];
    }
    if (i+1 < R && vecMatrix[i+1][j] < vecMatrix[i][j]) {
        if (vecLength[i+1][j] == 0) {
            CalculateLength(vecMatrix, vecLength, i+1, j, R, C);
        }
        nDown = vecLength[i+1][j];
    }

    int nMax = nLeft;
    nMax = nMax < nRight ? nRight : nMax;
    nMax = nMax < nTop ? nTop : nMax;
    nMax = nMax < nDown ? nDown : nMax;
    
    vecLength[i][j] = nMax + 1;
}

int CalculateMaxLength(const vector<vector<int> > & vecMatrix) 
{
    vector<vector<int> > vecLength;
    int R = vecMatrix.size();
    int C = vecMatrix[0].size();
    for (int i=0; i<R; ++i) {
        vector<int> vecTmp(C, 0);
        vecLength.push_back(vecTmp);
    }

    for (int i=0; i<R; ++i)
    {
        for (int j=0; j<C; ++j)
        {
            CalculateLength(vecMatrix, vecLength, i, j, R, C);
        }
    }

    int nMaxLength = 0;
    for (int i=0; i<R; ++i)
    {
        for (int j=0; j<C; ++j)
        {
            nMaxLength = nMaxLength < vecLength[i][j] ? vecLength[i][j] : nMaxLength;
        }
    }

    return nMaxLength;
}

int main(int argc, char ** argv)
{
    vector<vector<int> > vecMatrix;
    
    vector<int> vecTmpNum;
    vecTmpNum.resize(5);
    vecTmpNum[0] = 1;
    vecTmpNum[1] = 2;
    vecTmpNum[2] = 3;
    vecTmpNum[3] = 4;
    vecTmpNum[4] = 5;
    vecMatrix.push_back(vecTmpNum);
    vecTmpNum[0] = 16;
    vecTmpNum[1] = 17;
    vecTmpNum[2] = 18;
    vecTmpNum[3] = 19;
    vecTmpNum[4] = 6;
    vecMatrix.push_back(vecTmpNum);
    vecTmpNum[0] = 15;
    vecTmpNum[1] = 24;
    vecTmpNum[2] = 25;
    vecTmpNum[3] = 20;
    vecTmpNum[4] = 7;
    vecMatrix.push_back(vecTmpNum);
    vecTmpNum[0] = 14;
    vecTmpNum[1] = 23;
    vecTmpNum[2] = 22;
    vecTmpNum[3] = 21;
    vecTmpNum[4] = 8;
    vecMatrix.push_back(vecTmpNum);
    vecTmpNum[0] = 13;
    vecTmpNum[1] = 12;
    vecTmpNum[2] = 11;
    vecTmpNum[3] = 10;
    vecTmpNum[4] = 9;
    vecMatrix.push_back(vecTmpNum);

    Output(vecMatrix);

    cout << "MaxLength:" << CalculateMaxLength(vecMatrix) << endl;;

    return 0;
}

相关文章

  • 滑雪场最长路径问题

    解法很简单,遍历求解每个元素的最长深度,有点类似图的深度遍历算法,但是还是有些不同,另外,需要有个中间表用来记录已...

  • 最长路径问题

    题目描述现有A、B、C、D、E五个字符,以及M个字符串,每个字符串由这五个字符和1-9的整数间隔组成,如:A2B3...

  • 经典DP问题合集

    一、上台阶问题 二、矩阵最小路径和 三、最长递增子序列 四、最长公共子序列 五、背包问题

  • ***310. Minimum Height Trees [Me

    310. Minimum Height Trees 方法一:通过BFS找到最长的路径,返回中间的节点,找最长路径的...

  • 数据结构与算法--关键路径

    数据结构与算法--关键路径 关键路径与无环加权有向图的最长路径 现在考虑一个这样的问题:你今天事情比较多,要洗衣服...

  • 最长路径算法

    一、定义 最长路径算法类似于基于拓扑排序的最短路径算法。本文只针对加权有向无环图讨论。 二、基本思想 对于一幅加权...

  • 7. 关键路径

    关键路径 : 从源点到汇点的所有路径中,具有最大路径长度的路径称为关键路径 关键路径代表 : 1) 图中最长路径;...

  • 算法: 最长路径与任务规划

    我们通常听得最多的就是最短路径的应用了,但是最长路径却很少听说过,今天就跟大家说说一个最长路径应用的例子。你可能会...

  • 【POJ1088】-DP问题之最长路径

    题目地址:http://poj.org/problem?id=1088 问题描述:一个区域由一个二维数组给出。数组...

  • 687. 最长同值路径

    687. 最长同值路径 每次dfs返回的是以该节点为结尾的最长串长度

网友评论

      本文标题:滑雪场最长路径问题

      本文链接:https://www.haomeiwen.com/subject/xmwmvttx.html