南郵 OJ 1235 最大k乘積問題
阿新 • • 發佈:2019-02-10
最大k乘積問題
時間限制(普通/Java) : 1000 MS/ 3000 MS 執行記憶體限制 : 65536 KByte總提交 : 138 測試通過 : 17
比賽描述
設I是一個n位十進位制整數。如果將I劃分為k段,則可得到k個整數。這k個整數的乘積稱為I的一個k乘積。試設計一個演算法,對於給定的I和k,求出I的最大k乘積。
對於給定的I和k,程式設計計算I的最大k乘積。
輸入
輸入的第1行中有2個正整數n和k。正整數n是序列的長度;正整數k是分割的段數。接下來的一行中是一個n位十進位制整數。(n<=10)
輸出
輸出計算結果,第1行中的數是計算出的最大 k乘積。
樣例輸入
2 1
15
樣例輸出
15
提示
undefined
題目來源
演算法設計與實驗題解
//dp[i][j]:從第1為到第i位構成的數字,華為j段,構成的最大乘積,i∈[1,n],j∈[1,n] //num[i][j]:從第i位到第j位組成的數字,1<=i<=j<=n #include<stdio.h> #define N 11 int main(){ int n,k,i,j,r; long dp[N][N],temp; long num[N][N]; char c[N]; scanf("%d%d",&n,&k); scanf("%s",c); for(i=1;i<=n;i++){ num[i][i] = c[i-1]-'0'; for(j=i+1;j<=n;j++){ num[i][j] = num[i][j-1]*10 + c[j-1] - '0'; } } for(i=1; i<=n; i++){ dp[i][1] = num[1][i]; } for(i=2; i<=n; i++){ for(j=2; j<=i && j<=k; j++){ dp[i][j]=0; for(r=j-1; r<=i-1; r++){ if( (temp=dp[r][j-1]*num[r+1][i]) > dp[i][j] ){ dp[i][j] = temp; } } } } printf("%ld",dp[n][k]); }