JOJ 2412 Divide the finger
2010-07-12 00:30
246 查看
题意:把一个不超过16位的数字分成m份,求乘积最大值。一个例子:12345拆成两部分,1234|5、123|45 ......,但是最大值是1234 * 5 = 6170
思路:动态规划,f(i, j, t)表示数字的第i位到j位,拆成t部分的最大值。方程:f(i, j, t) = max { f(i, k, 1) * f(k+1, j, t-1) } , k = i..(j-t+1) ;
即, t份的乘积最大值,等于 最左面1份的最大值 与 其余t-1份的最大值 的最大值。-----最优性原理。决策k把问题分成两个子问题
代码:
代码
思路:动态规划,f(i, j, t)表示数字的第i位到j位,拆成t部分的最大值。方程:f(i, j, t) = max { f(i, k, 1) * f(k+1, j, t-1) } , k = i..(j-t+1) ;
即, t份的乘积最大值,等于 最左面1份的最大值 与 其余t-1份的最大值 的最大值。-----最优性原理。决策k把问题分成两个子问题
代码:
代码
#include<cstdio> #include<cstring> using namespace std; int n, m; char num[20]; long long dp[20][20][20]; long long str_int(int i, int j){//i<=j long long b, s; b = 1; s = 0; for(int k=j; k >= i; --k){ s += (num[k] - '0') * b; b *= 10; } return s; } void process(){ int i, j, t, k; long long max, tmp; for(i=1; i<=n; ++i) for(j=i; j<=n; ++j) dp[i][j][1] = str_int(i, j); for(t=2; t<=m; ++t)//分成t份 for(i=1; i<=n; ++i) for(j=i+t-1; j<=n; ++j){ max = 0; for(k=i; j-k+1 >= t; ++k){ tmp = dp[i][k][1] * dp[k+1][j][t-1]; if(tmp > max) max = tmp; } dp[i][j][t] = max; } } int main(){ // freopen("in", "r", stdin); while(scanf("%s %d", &num[1], &m) != EOF){ n = strlen(&num[1]); process(); printf("%lld\n", dp[1] [m]); } }
相关文章推荐
- 2412: Divide the finger
- JOJ2026:Divide the Birthday Cake
- HDU 5783 Divide the Sequence——贪心
- HDU-5783 Divide the Sequence(贪心水题)
- UVA 10256 The Great Divide(凸包划分)
- 2016多校5 hdu 5783 Divide the Sequence 贪心
- Chef -- Divide the Tangerine
- 2016多校5 hdoj5783 Divide the Sequence
- 2016 多校 Multi-University Training Contest 5 Divide the Sequence
- 【HDOJ5783】Divide the Sequence(贪心)
- code chef - Divide the Tangerine 橘子分块算法题解
- 【HDU5783】Divide the Sequence(贪心)
- the master theorem of divide-and-conquer
- Sicily 1920 Divide The Stones
- joj 2677 The Natural Series
- Divide the Sequence
- HDU 5783 Divide the Sequence
- 2016 Multi-University Training Contest 5 1003 Divide the Sequence (贪心)
- The Finger R2 for Mac(Reaktor 6复音效果器) v1.3.0破解版
- 【贪心】HDU 5783 Divide the Sequence