#include<iostream>
#include"string"
#include <malloc.h>
#include <queue>
using namespace std;
int p[] = { 0,1,5,8,9,10,17,17,20,24,30 };
int r[11];
int cut_rod(int n) {
if (n == 0) return 0;
int q = -1;
for (int i = 1; i <= n; i++) q = max(q, p[i] + cut_rod(n - i));
return q;
}
int bottom_cut_rod(int n) {
int q;
r[0] = 0;
for (int i = 1; i < n + 1; i++)
{
q = INT_MIN;
for (int j = 1; j <= i; j++) r[i] = max(r[i], p[j] + r[i - j]);
}
return r[n];
}
int memoized_cut_rod_aux(int n) {
int q;
if (r[n] >= 0) return r[n];
if (n == 0) q = 0;
else {
q = INT_MIN;
for (int i = 1; i < n + 1; i++) q = max(q, p[i] + memoized_cut_rod_aux(n - i));
}
r[n] = q;
return q;
}
int memoized_cut_rod(int n){
for (int i = 0; i < n + 1; i++) r[i] = -1;
return memoized_cut_rod_aux(n);
}
int main() {
cout << "自下而上: " << cut_rod(4) << endl;
cout << "动态规划的自下而上: " << bottom_cut_rod(4) << endl;
cout << "填表式的自上而下: " << memoized_cut_rod(4) << endl;
return 0;
}