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时应该先找到子问题的解决方法以及如何写递归求出答案。

浙公网安备 33010602011771号