整数拆分 动态规划 C语言

第一种方法
是采用自上而下得递归方案,所以采用了递归,时间开销比较大,所以在领扣中时间超时了

int max(int a, int b)
{
   return a>=b?a:b;
}
int max3(int a,int b,int c)
{
    return(max(a,max(b,c)));
}


int integerBreak2(int n,int*a){//递归函数 
 int res = 1;
 if(a[n]!=0)
 {
 return a[n];
 }
 for(int i =1;i<=n-1;i++)
 {
       
     res = max3(res,i*(n-i),i*integerBreak2(n-i,a));//一个已知的最大值,一个分成两个
     //数,一个是n-i的最大值和i,此处是核心,重点标注
 }
   return res;
}
int integerBreak(int n)
{
    //一个数分割,不管分成几份,那必须可以分成1+... 2+.... 3+.... 4+.....  n-1+...
    //所以呢,n最大乘积可以在max{1*integerbreak(n-1),2*intergerbreak(n-2)....}
    int* memo=(int *)calloc((n+1),sizeof(int));
    return(integerBreak2(n,memo));
}

第二种方法是采用自下而上 ,这也是比较常见得一种方法了

int max(int a, int b)
{
   return a>=b?a:b;
}
int max3(int a,int b,int c)
{
    return(max(a,max(b,c)));
}
int integerBreak(int n){
     int* memo = (int *)calloc(n+1,sizeof(int));
     memo[1]=1;
     for(int i =2;i<=n;i++)
     {
         for(int j =1;j<i;j++)
         {
             memo[i]=max3(memo[i],j*memo[i-j],j*(i-j));
     }}
     return(memo[n]);
}

执行用时 :
0 ms
, 在所有 C 提交中击败了
100.00%
的用户
内存消耗 :
7 MB
, 在所有 C 提交中击败了
13.48%
的用户

发布了37 篇原创文章 · 获赞 1 · 访问量 636

猜你喜欢

转载自blog.csdn.net/zzuzhaohp/article/details/104450270