動態規劃最大K乘積問題



最大K乘積動態規劃解決

設I是一個n位十進制整數。如果將I分割為k段,則可得到k個整數。這k個整數的乘積稱為I的一個k乘積。試設計一個算法,對于給定的I和k,求出I的最大k乘積。
測試:
輸入: 2 1 (2是位數,1是分幾段)
   15 (15是I)
輸出:15
輸入: 5 2
   12345
輸出:6170

分析:

1、數組m[i][j]為 將前i位數分成j段的最大乘積
  2、數組打底:前1位數,分成1段;前2位數,分成1段;前3位數,分成1段......前n位數,分成1段。(就是先計算出前i位的大小)
  3、m[i][j]=Max{m[k][j-1]*a[i-k]},其意思就是把前k(1<=k<i)個數分成j-1段,再乘以a[i-k],a[i-k]代表著,第k位到第i位數的數值.......

#include<stdio.h>

int cal(char* num,int i,int j){
    int value=0;
    while(j>=i){
        value=value*10+(num[i]-'0');
        i++;    
    }
    return value;
}

int main(){
    int n,k;               //n代表整數有n位,k指分成多少段
    scanf("%d%d",&n,&k);
    getchar();
    char num[n+1];        //接收單個字符 
    int m[n+1][n+1];      //m[i][j] 前i個數字,分成j段 
    int max,value;
    
    for(int i=1;i<n+1;i++){
        scanf("%c",&num[i]);
    } 

    //數組打底
    m[1][1]=num[1]-'0';                     
    for(int i=2;i<n+1;i++)                 
        m[i][1]=m[i-1][1]*10+(num[i]-'0');   //前i個數字,分成一段 
    
    for(int i=2;i<=k;i++){   //分成多少段 
        max=-1; 
        for(int j=i;j<n+1;j++){   //j從開始遍歷到最后一個數,因為i<j時(前3個數,分成4段),無意義,所以直接令j=i 
            for(int d=1;d<=j-1;d++){
                value=m[d][i-1]*cal(num,d+1,j);
                if(value>max)
                    max=value;
            }
            m[j][i]=max;    
        } 
    }
    
    printf("最大k乘積為:%d\n",m[n][k]);  
    return 0;
}
運行截圖

運行截圖
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 背景 一年多以前我在知乎上答了有關LeetCode的問題, 分享了一些自己做題目的經驗。 張土汪:刷leetcod...
    土汪閱讀 12,771評論 0 33
  • 動態規劃(Dynamic Programming) 本文包括: 動態規劃定義 狀態轉移方程 動態規劃算法步驟 最長...
    廖少少閱讀 3,332評論 0 18
  • 計算機二級C語言上機題庫(南開版) 1.m個人的成績存放在score數組中,請編寫函數fun,它的功能是:將低于平...
    MrSunbeam閱讀 6,464評論 1 42
  • 【程序1】 題目:古典問題:有一對兔子,從出生后第3個月起每個月都生一對兔子,小兔子長到第三個月后每個月又生一對兔...
    葉總韓閱讀 5,165評論 0 41
  • Java經典問題算法大全 /*【程序1】 題目:古典問題:有一對兔子,從出生后第3個月起每個月都生一對兔子,小兔子...
    趙宇_阿特奇閱讀 1,910評論 0 2