正整數n劃分為m段,求m段的最大乘積 【區間DP】
阿新 • • 發佈:2019-02-13
時間限制:1000 ms | 記憶體限制:65535 KB
- 描述
-
給出兩個整數 n , m ,要求在 n 中加入m - 1 個乘號,將n分成m段,求出這m段的最大乘積
- 輸入
- 第一行是一個整數T,表示有T組測試資料
接下來T行,每行有兩個正整數 n,m ( 1<= n < 10^19, 0 < m <= n的位數); - 輸出
- 輸出每組測試樣例結果為一個整數佔一行
- 樣例輸入
-
2 111 2 1111 2
- 樣例輸出
-
11 121
#include <cstdio> #include <iostream> #include <cstring> #include <string> using namespace std; typedef long long LL; char n[25]; LL dp[25][25]; LL a[25][25]; int main () { int T, m; scanf("%d", &T); while(T--) { scanf("%s%d", &n, &m); int len = strlen(n); // 初始化 for(int i=0; i<len; i++) { a[i][i]= n[i] - '0'; for(int j=i+1; j<len; j++) { a[i][j] = a[i][j-1]*10 + n[j]-'0'; } } for(int i=0; i<len; i++) { dp[i][1] = a[0][i]; for(int j=2; j<=m; j++) { if(i+1 < j) { dp[i][j]= 0; } else { dp[i][j] = -1; for(int k=1; k<=i; k++) { if(dp[k-1][j-1]*a[k][i] > dp[i][j]) { dp[i][j] = dp[k-1][j-1]*a[k][i]; } } } } } printf("%lld\n", dp[len-1][m]); } return 0; }