• 《OFFER14》14_CuttingRope


     
      1 // 面试题14:剪绳子
      2 // 题目:给你一根长度为n绳子,请把绳子剪成m段(m、n都是整数,n>1并且m≥1)。
      3 // 每段的绳子的长度记为k[0]、k[1]、……、k[m]。k[0]*k[1]*…*k[m]可能的最大乘
      4 // 积是多少?例如当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此
      5 // 时得到最大的乘积18。
      6 
      7 #include <iostream>
      8 #include <cmath>
      9 
     10 // ====================动态规划====================
     11 int maxProductAfterCutting_solution1(int length)
     12 {
     13     if(length < 2)
     14         return 0;
     15     if(length == 2)
     16         return 1;
     17     if(length == 3)
     18         return 2;
     19 
     20     int* products = new int[length + 1];
     21     products[0] = 0;
     22     products[1] = 1;
     23     products[2] = 2;
     24     products[3] = 3;
     25 
     26     int max = 0;
     27     for(int i = 4; i <= length; ++i)
     28     {
     29         max = 0;
     30         for(int j = 1; j <= i / 2; ++j)
     31         {
     32             int product = products[j] * products[i - j];
     33             if(max < product)
     34                 max = product;
     35 
     36             products[i] = max;
     37         }
     38     }
     39 
     40     max = products[length];
     41     delete[] products;
     42 
     43     return max;
     44 }
     45 
     46 // ====================贪婪算法====================
     47 int maxProductAfterCutting_solution2(int length)
     48 {
     49     if(length < 2)
     50         return 0;
     51     if(length == 2)
     52         return 1;
     53     if(length == 3)
     54         return 2;
     55 
     56     // 尽可能多地减去长度为3的绳子段
     57     int timesOf3 = length / 3;
     58 
     59     // 当绳子最后剩下的长度为4的时候,不能再剪去长度为3的绳子段。
     60     // 此时更好的方法是把绳子剪成长度为2的两段,因为2*2 > 3*1。
     61     if(length - timesOf3 * 3 == 1)
     62         timesOf3 -= 1;
     63 
     64     int timesOf2 = (length - timesOf3 * 3) / 2;
     65 
     66     return (int) (pow(3, timesOf3)) * (int) (pow(2, timesOf2));
     67 }
     68 
     69 // ====================测试代码====================
     70 void test(const char* testName, int length, int expected)
     71 {
     72     int result1 = maxProductAfterCutting_solution1(length);
     73     if(result1 == expected)
     74         std::cout << "Solution1 for " << testName << " passed." << std::endl;
     75     else
     76         std::cout << "Solution1 for " << testName << " FAILED." << std::endl;
     77 
     78     int result2 = maxProductAfterCutting_solution2(length);
     79     if(result2 == expected)
     80         std::cout << "Solution2 for " << testName << " passed." << std::endl;
     81     else
     82         std::cout << "Solution2 for " << testName << " FAILED." << std::endl;
     83 }
     84 
     85 void test1()
     86 {
     87     int length = 1;
     88     int expected = 0;
     89     test("test1", length, expected);
     90 }
     91 
     92 void test2()
     93 {
     94     int length = 2;
     95     int expected = 1;
     96     test("test2", length, expected);
     97 }
     98 
     99 void test3()
    100 {
    101     int length = 3;
    102     int expected = 2;
    103     test("test3", length, expected);
    104 }
    105 
    106 void test4()
    107 {
    108     int length = 4;
    109     int expected = 4;
    110     test("test4", length, expected);
    111 }
    112 
    113 void test5()
    114 {
    115     int length = 5;
    116     int expected = 6;
    117     test("test5", length, expected);
    118 }
    119 
    120 void test6()
    121 {
    122     int length = 6;
    123     int expected = 9;
    124     test("test6", length, expected);
    125 }
    126 
    127 void test7()
    128 {
    129     int length = 7;
    130     int expected = 12;
    131     test("test7", length, expected);
    132 }
    133 
    134 void test8()
    135 {
    136     int length = 8;
    137     int expected = 18;
    138     test("test8", length, expected);
    139 }
    140 
    141 void test9()
    142 {
    143     int length = 9;
    144     int expected = 27;
    145     test("test9", length, expected);
    146 }
    147 
    148 void test10()
    149 {
    150     int length = 10;
    151     int expected = 36;
    152     test("test10", length, expected);
    153 }
    154 
    155 void test11()
    156 {
    157     int length = 50;
    158     int expected = 86093442;
    159     test("test11", length, expected);
    160 }
    161 
    162 int main(int agrc, char* argv[])
    163 {
    164     test1();
    165     test2();
    166     test3();
    167     test4();
    168     test5();
    169     test6();
    170     test7();
    171     test8();
    172     test9();
    173     test10();
    174     test11();
    175 
    176     return 0;
    177 }
    View Code
  • 相关阅读:
    CodeForces 97 E. Leaders(点双连通分量 + 倍增)
    51nod 1318 最大公约数与最小公倍数方程组(2-SAT)
    关于 atcoder 页面美化的 css
    凸优化小结
    LOJ #2802. 「CCC 2018」平衡树(整除分块 + dp)
    AGC 016 F
    BZOJ 3745: [Coci2015]Norma(分治)
    BZOJ 1124: [POI2008]枪战Maf(构造 + 贪心)
    Linux之Json20160705
    Linux之ioctl20160705
  • 原文地址:https://www.cnblogs.com/focus-z/p/10086929.html
Copyright © 2020-2023  润新知