dp动态规划

动态规划与分支方法相似,通过子问题的最优解来求得原问题的一个最优解。大多情况下能避免贪心产生的“短视”问题,比如硬币问题等。
举个dp典型题目

钢条切割

某公司购买长钢条,将其切割出售,公司希望知道最佳切割方案。

长度i 价格pi
1 1
2 5
3 8
4 9
5 10
6 17
7 17
8 20
9 24
10 30
code:
#include "stdlib.h"
#include "cstring"
#include "string"
#include "algorithm"
using namespace std;

int p[11] = {0, 1, 5, 8, 9, 10, 17, 17, 20, 24, 30}; //i英寸能卖p[i]元
int r[100000];
int d[100000],d1=1;
int bottom_up_cut_rod(int n)//自底向上+备忘
{
    memset(r, 0, sizeof(r)); memset(d,0,sizeof(d));
    r[0] = 0;
    for (int j = 1; j <= n; j++)
    {
        int q = -1;
        for (int i = 1; i <= j; i++)
        {
            if(q <p[i > 10 ? 0 : i] + r[j - i])//相当于每个都拿来试一次,观察最优解
            {
                q = p[i > 10 ? 0 : i] + r[j - i];
                d[j]=i;//重构解,记录当前截取长度
            }
        }
        r[j] = q;
    }
    return r[n];
}

void print_cut_rod_solution(int n)
{
    while(n>0)
    {
        cout<<d[n]<<" ";
        n-=d[n];
    }
}

int main()
{
    int n;
    cin >> n;
    cout << bottom_up_cut_rod(n)<<endl;
    print_cut_rod_solution(n);
}

dp重要核心就是先求子问题的最优解,由子到根,通过递归等方法来实现最后原问题的求解。因此在使用dp时应该先找到子问题的解决方法以及如何写递归求出答案。

posted @ 2021-05-08 22:08  Paramecium  阅读(83)  评论(0)    收藏  举报