• 动态规划的几个实例


    1.算一个数组中的每一项目等于其它项的乘积:

    //Don't forget to free the result.
    int* MutilArray(int nInput[], int nCount)
    {
        int nMutilAll = 1;
        int *PResult = NULL;
    
        PResult = (int*)malloc(sizeof(int) * nCount);
        if (!PResult)
           return NULL;
    
        for (int i=0; i < nCount; i++)
        {
            nMutilAll *= nInput[i];
        }
    
        for (int i=0; i< nCount; i++)
        {
            PResult[i]  = nMutilAll/nInput[i];
        }
    
        return PResult;
    }

    2.如果我们有面值为1元、3元和5元的硬币若干枚,如何用最少的硬币凑够11(X)元? 

    int nConisArray[] = {1, 3, 5};
    
    bool HaveThisCoin(int nCoin)
    {
        if (nCoin == 1 || nCoin == 3 || nCoin == 5)
        {
            return true;
        }
        return false;
    }
    
    //dp
    int dp(int nFindMondy)
    {
        int nLen = 1;
        if (HaveThisCoin(nFindMondy))
        {
            nLen = 1;
        }
        else
        {
            if (nFindMondy >= 5)
            {
                nLen = dp(nFindMondy - 5) + 1;
            }
            else if(nFindMondy >= 3)
            {
                nLen = dp(nFindMondy - 3) + 1;
            }
            else
            {
                nLen = dp(nFindMondy - 1) + 1;
            }
        }
        return nLen;
    }

    2.一个序列有N个数:A[1],A[2],…,A[N],求出最长非降子序列的长度。

    int LIS(int nArray[], int nCnt)
    {
        int *pArray = new int[nCnt];
        int  nLen = 1;
    
        for (int i=0; i < nCnt; i++)
        {
            pArray[i] = 1;
            for (int j = 0; j < i; j++)
            {
                if (nArray[j] > nArray[i] && pArray[j] + 1 > pArray[i])
                    pArray[i] = pArray[j] + 1;
            }
    
            if (pArray[i] > nLen)
               nLen = pArray[i];
        }
    
        delete[] pArray;
        return nLen;
    }

    3.平面上有N*M个格子,每个格子中放着一定数量的苹果。你从左上角的格子开始, 每一步只能向下走或是向右走,每次走到一个格子上就把格子里的苹果收集起来, 这样下去,你最多能收集到多少个苹果。

    #define ROWS
    #define COLUMNS
    
    int max(int a, int b)
    {
        return a > b ? a : b;
    }
    
    int Demon(int i, int j)
    {
        int nCount = 0;
    
        if (i == ROWS - 1 && j == COLUMNS -1)
        {
            return nApples[ROWS - 1][COLUMNS - 1];
        }
    
        else if ( i == ROWS - 1 && j < COLUMNS - 1)
        {
            nCount = nApples[i][j] + Demon(i, j + 1);
        }
        else if (j == COLUMNS - 1 && i < ROWS - 1)
        {
            nCount = nApples[i][j] + Demon(i + 1, j);
        }
    
        if (i < COLUMNS - 1 && j < COLUMNS - 1)
        {
             nCount = nApples[i][j] + max(Demon(i + 1, j), Demon(i, j + 1));
        }
        return nCount;
    }
  • 相关阅读:
    为什么我们不要 .NET 程序员
    Jquery异步请求数据实例代码
    关系数据库中表的基本属性有哪些
    利用VC从DLL传递消息到EXE
    新实体与原实体之间为一对多关系
    本人C++ Builder开发的仿Windows桌面应用程序源码
    delphi窗体动态设计 在系统运行时动态更改控件属性
    DB.ASP 用Javascript写ASP很灵活很好用很easy
    CrazyScan Satellite scan software 卫星扫描
    delphi中窗体半透明效果如何实现
  • 原文地址:https://www.cnblogs.com/algorithmic/p/3656417.html
Copyright © 2020-2023  润新知