滑雪动态规划

此题通过枚举每一个坐标的最长路径,从而找出最长路径。在找坐标map[x][y]的最长路径是通过递归找出map[x-1][y](上),map[x+1][y](下),map[x][y-1](左),map[x][y+1](右)各自的最长路径;将MAX(map[x-1][y],map[x+1][y],map[x][y-1],map[x][y+1])+1即等于map[x][y]的最长路径。在对不同坐标递归时会多次访问到同一个map[i][j],做了大量重复操作,若用一个数组temp[][]保存访问到的map[i][j]的最长路径值,在下次访问到map[i][j]是直接返回temp[i][j]值,就大大提高效率【这就是动态规划】。

#define HEIGHT 100

const int g_nX = {-1,0,1,0};

const int g_nY={0,1,0,-1};

int g_nR;

int g_nC;

int g_nGridHeight[HEIGHT][HEIGHT];

int g_nGridPathLength[HEIGHT][HEIGHT];

// 检测越界

bool OutOfRange(int i, int j)

{

    if((i < 0)||(i >= g_nR))

    {

        return false;

    }

    else if((j<0)||(j>=g_nC))

    {

        return false;

    }

    return true;

}

// 计算一个点的最长路线,使用函数堆栈进行深度搜素

int dp(int i, int j)

{

    // 存在既返回,0代表无

    if(g_nGridPathLength[i][j] > 0)

    {

        return g_nGridPathLength[i][j];

    }

    // 在四个方向上循环深度探索

    for(int nDirection = 0; nDirection < 4; nDirection++)

    {

        // 检测越界

        if(OutOfRange(i+g_nX[nDirection], j+g_nY[nDirection]))

 

        {

            // 判断临点是否高度低于本点。如果低于,可以将此点加入搜索路径

            if(g_nGridHeight[i][j] > g_nGridHeight[i+g_nX[nDirection]][j+g_nY[nDirection]])

 

            {

                // 计算临点的dp值,使用了递归。

                if(g_nGridPathLength[i][j] < dp(i+g_nX[nDirection], j+g_nY[nDirection]) + 1)

 

 

                {

                    g_nGridPathLength[i][j] = p(i+g_nX[nDirection], j+g_nY[nDirection]) + 1;

                }

            }

        }   

    }

    return g_nGridPathLength[i][j];

 

}

int main()

{

    int max =0;

    intput(nR, nC);//输入g_nHeight数据,输入滑雪场的长宽

    init();//初始化g_nGridPathLength全0

    for(int nX=0;nX<nR; nX++)

    {

        for(int nY=0;nY<nC;nY++)

        {

             if(max < dp(nX,nY))

             {

                 max = dp(nX,nY);

             }

        }

    }

    return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值