#include<iostream>
#include<time.h>
using namespace std;
int maxnum(int a, int b) {
return a>b?a:b;
}
int cutrod(int n, int *p) {
if(n==0) return 0;
int max=INT_MIN;
for(int i=1;i<=n;i++)//这块i必须从1开始
max=maxnum(max, p[i]+cutrod(n-i, p));
return max;
}//没用动态规划
int updowncutrod(int n, int *p, int *r) {
if(r[n]>=0) return r[n];
int max;
if(n==0) max=0;
else max=INT_MIN;
for(int i=1;i<=n;i++)
max=maxnum(max, p[i]+updowncutrod(n-i, p, r));
r[n]=max;
return max;
}
int dpupdowncutrod(int n, int *p) {
int *r=new int[n+1];
for(int i=0;i<=n;i++)
r[i]=INT_MIN;
int res=updowncutrod(n, p, r);
delete []r;
return res;
}//自顶向下动态规划
int downupcutrod(int n, int *p) {
int *r=new int[n+1];
r[0]=0;
for(int j=1;j<=n;j++) {
int max=INT_MIN;
for(int i=1;i<=j;i++)
max=maxnum(max,p[i]+r[j-i]);
r[j]=max;
}
int res=r[n];
delete []r;
return res;
}//自底向上动态规划
int main() {
clock_t start,finish;
int p[11]={0,1,5,8,9,10,17,17,20,24,30};
start=clock();
for(int i=0;i<=10;i++)
cout<<cutrod(i,p)<<" ";
cout<<endl;
finish=clock();
cout<<finish-start<<endl;
start=clock();
for(int i=0;i<=10;i++)
cout<<dpupdowncutrod(i,p)<<" ";
cout<<endl;
finish=clock();
cout<<finish-start<<endl;
start=clock();
for(int i=0;i<=10;i++)
cout<<downupcutrod(i,p)<<" ";
cout<<endl;
finish=clock();
cout<<finish-start<<endl;
system("pause");
return 0;
}