1. 程式人生 > >正整數n劃分為m段,求m段的最大乘積 【區間DP】

正整數n劃分為m段,求m段的最大乘積 【區間DP】

時間限制: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; }