#include<iostream>
using namespace std;
int find_max(int a,int b)
{
return (a<b) ? b:a;
}
int memoized_cut_rpd_aux(int p[],int n,int r[])
{
int q=-1;
if (n!=0 && r[n-1]>0)
{
return r[n-1];
}
if (0==n)
{
q=0;
return q;
}
else
{
for (int i=1;i<=n;i++)
{
q=find_max(q,p[i-1]+memoized_cut_rpd_aux(p,n-i,r));
}
}
r[n-1]=q;
return q;
}
int memoized_cut_rod(int p[],int n)
{
int len=sizeof(p)/sizeof(p[0]);
int * r=new int[n];
for (int i=0;i<n;i++)
{
r[i]=-1;
}
memoized_cut_rpd_aux(p,n,r);
cout<<"----------"<<endl;
for (int i=0;i<n;i++)
{
cout<<" "<<r[i];
}
cout<<endl;
int q=r[n-1];
delete [] r;
return q;
}
int bottom_cut_rod(int p[],int n)
{
int *r=new int[n+1];
r[0]=0;
for (int j=1;j<=n;j++)
{
int q=-1;
for (int i=1;i<=j;i++)
{
q=find_max(q,p[i-1]+r[j-i]);
}
cout<<"---:q="<<q<<" j="<<j<<endl;
r[j]=q;
}
int tmp=r[n];
delete [] r;
return tmp;
}
int main()
{
int p[]={1,5,8,9,10,17,17,20,24,30};
int len=sizeof(p)/sizeof(p[0]);
int q=memoized_cut_rod(p,10);
cout<<"结果"<<q<<endl;
int m=bottom_cut_rod(p,10);
cout<<"结果"<<m<<endl;
return 0;
}