这是一道基础的线性dp问题,问题描述如下。
某厂家给出了长度为i的钢条的价格p[i],现某公司有长度为n的钢条,想要将其切割之后出售给厂家,求售得价格最高的切割方案。
这道题可以用记忆化搜索来完成,也可以用递推dp,转移方程比较麻烦的一点就是由于切割长度多种,钢条长度在改变时受到影响,因此在计算时又需要从头开始。
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
const int p[11] = { 0,1,5,8,9,10,17,17,20,24,30 };
int dp[100] = { 0 }, i = 0, j = 0, n = 0,temp = -1;
cin >> n;
for (i = 1; i <= n; i++)
{
temp = -1;
for (j = 1; j <= i; j++)
{
temp = max(temp, p[j] + dp[i - j]);
}
dp[i] = temp;
}
cout << dp[n];
return 0;
}