最大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;
}
運行截圖
運行截圖