zoukankan      html  css  js  c++  java
  • 《剑指offer》第四十七题(礼物的最大价值)

    // 面试题47:礼物的最大价值
    // 题目:在一个m×n的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值
    // (价值大于0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向左或
    // 者向下移动一格直到到达棋盘的右下角。给定一个棋盘及其上面的礼物,请计
    // 算你最多能拿到多少价值的礼物?
    
    #include <algorithm>
    #include <iostream>
    
    int getMaxValue_solution1(const int* values, int rows, int cols)
    //使用一个二维辅助空间
    {
        if (values == nullptr || rows <= 0 || cols <= 0)
            return 0;
    
        int** maxValues = new int*[rows];//定义一个二维数组,用来存储当前位置最大值
        for (int i = 0; i < rows; ++i)
            maxValues[i] = new int[cols];
    
        for (int i = 0; i < rows; ++i)
        {
            for (int j = 0; j < cols; ++j)
            {
                int left = 0;
                int up = 0;
    
                if (i > 0)//如果有
                    up = maxValues[i - 1][j];
    
                if (j > 0)
                    left = maxValues[i][j - 1];
    
                maxValues[i][j] = std::max(left, up) + values[i * cols + j];
            }
        }
    
        int maxValue = maxValues[rows - 1][cols - 1];//取出右下角最大值
    
        for (int i = 0; i < rows; ++i)//删除它们
            delete[] maxValues[i];
        delete[] maxValues;
    
        return maxValue;
    }
    
    int getMaxValue_solution2(const int* values, int rows, int cols)
    //空间优化,将二维辅助数组变为一维
    {
        if (values == nullptr || rows <= 0 || cols <= 0)
            return 0;
    
        int* maxValues = new int[cols];
        for (int i = 0; i < rows; ++i)
        {
            for (int j = 0; j < cols; ++j)
            {
                int left = 0;
                int up = 0;
    
                if (i > 0)
                    up = maxValues[j];
    
                if (j > 0)
                    left = maxValues[j - 1];
    
                maxValues[j] = std::max(left, up) + values[i * cols + j];//更新maxValues[j]值就好了
            }
        }
    
        int maxValue = maxValues[cols - 1];
    
        delete[] maxValues;
    
        return maxValue;
    }
    
    // ====================测试代码====================
    void test(const char* testName, const int* values, int rows, int cols, int expected)
    {
        if (getMaxValue_solution1(values, rows, cols) == expected)
            std::cout << testName << ": solution1 passed." << std::endl;
        else
            std::cout << testName << ": solution1 FAILED." << std::endl;
    
        if (getMaxValue_solution2(values, rows, cols) == expected)
            std::cout << testName << ": solution2 passed." << std::endl;
        else
            std::cout << testName << ": solution2 FAILED." << std::endl;
    }
    
    void test1()
    {
        // 三行三列
        int values[][3] = {//看看秀儿的二维数组定义方法
            { 1, 2, 3 },
            { 4, 5, 6 },
            { 7, 8, 9 }
        };
        int expected = 29;
        test("test1", (const int*)values, 3, 3, expected);
    }
    
    void test2()
    {
        //四行四列
        int values[][4] = {
            { 1, 10, 3, 8 },
            { 12, 2, 9, 6 },
            { 5, 7, 4, 11 },
            { 3, 7, 16, 5 }
        };
        int expected = 53;
        test("test2", (const int*)values, 4, 4, expected);
    }
    
    void test3()
    {
        // 一行四列
        int values[][4] = {
            { 1, 10, 3, 8 }
        };
        int expected = 22;
        test("test3", (const int*)values, 1, 4, expected);
    }
    
    void test4()
    {
        int values[4][1] = {
            { 1 },
            { 12 },
            { 5 },
            { 3 }
        };
        int expected = 21;
        test("test4", (const int*)values, 4, 1, expected);
    }
    
    void test5()
    {
        // 一行一列
        int values[][1] = {
            { 3 }
        };
        int expected = 3;
        test("test5", (const int*)values, 1, 1, expected);
    }
    
    void test6()
    {
        // 空指针
        int expected = 0;
        test("test6", nullptr, 0, 0, expected);
    }
    
    int main(int argc, char* argv[])
    {
        test1();
        test2();
        test3();
        test4();
        test5();
        system("pause");
        return 0;
    }
  • 相关阅读:
    1.4.2.3. SETUP(Core Data 应用程序实践指南)
    1.4.2.2. PATHS(Core Data 应用程序实践指南)
    1.4.2.1. FILES(Core Data 应用程序实践指南)
    1.4.2. 实现 Core Data Helper 类(Core Data 应用程序实践指南)
    1.4.1. Core Data Helper 简介(Core Data 应用程序实践指南)
    1.4. 为现有的应用程序添加 Core Data 支持(Core Data 应用程序实践指南)
    1.3.2. App Icon 和 Launch Image(Core Data 应用程序实践指南)
    1.3.1. 新建Xcode项目并设置故事板(Core Data 应用程序实践指南)
    php验证邮箱是否合法
    如何使js函数异步执行
  • 原文地址:https://www.cnblogs.com/CJT-blog/p/10524593.html
Copyright © 2011-2022 走看看