标签:
给出两个整数 n , m ,要求在 n 中加入m - 1 个乘号,将n分成m段,求出这m段的最大乘积
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; }
NYOJ 746 - 正整数n划分为m段,求m段的最大乘积 【区间DP】
标签:
原文地址:http://www.cnblogs.com/AcIsFun/p/5345574.html