动态规划经典例题:钢条切割_递推

 

动态规划经典例题:钢条切割_算法_02

一、递归算法

如果在第i个地方切割,就把钢条分为两个长度为i,n-i的钢条,问题转化为求这切割两个钢条的最大价值之和

考虑到不切割时的价值

只要比较不切割时的价值和所有切割情况价值和的最大值即可

递归出口:

当长度为0,返回0

递推式

结果=max(钢条不切割时的价值,钢条切成两半的价值)

递归计算出这两半的价值(子问题独立)

钢条切割的地方可以在第1个,第2个,第n/2个位置(之后对称)

 代码:

const int price[] = { 0,1,5,8,9,10,17,17,20,24,30 };
    int max_price(const int *p,int n)//求长度为n英寸切割方案的最大价值
    {
        if (n == 0)
        {
            return 0;
        }
        int q = p[n];//不切割价值
        

        for (int i = 1; i <= n / 2; i++)
        {
            q = max(q,max_price(p,i)+max_price(p,n-i));

        }
        return q;

    }
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.

二.动态规划

动态规划经典例题:钢条切割_leetcode_03


动态规划经典例题:钢条切割_leetcode_04

 代码:
 

const int price[] = { 0,1,5,8,9,10,17,17,20,24,30 };
    int max_price(const int *p,int n)//求长度为n英寸切割方案的最大价值
    {
        int dp[11];
        dp[0] = 0;
        for (int i =1; i<=10; i++)
        {
            int m = 0;
            for (int j = 1; j <=i; j++)
            {
                m = max(m,dp[i-j] + price[j]);
            }
            dp[i] = m;

        }
        return dp[n];
    }
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.

 

动态规划经典例题:钢条切割_递推_05