【dp】最大k乘积问题
2011-08-31 22:41
393 查看
问题描述: | 设I是一个 n位十进制整数。如果将I划分为 k段,则可得到k个整数。这k个整数的乘积称为I 的一个 k乘积。试设计一个算法,对于给定的 I和 k,求出 I的最大 k乘积。 | |
编程任务: | 对于给定的I和k,编程计算I的最大k 乘积。 | |
数据输入: | 由文件input.txt提供输入数据。文件的第1 行中有2个正整数n和 k。正整数n是序列的长度; 正整数k是分割的段数。 接下来的一行中是一个n位十进制整数。(n<=10) | |
结果输出: | 程序运行结束时,将计算结果输出到文件 output.txt 中。文件的第 1 行中的数是计算出的最 大k乘积。 | |
样例: | 2 1 15 | 15 |
核心思想: | 先预处理每段数字然后f[i,j]=max{f[i-p,j-1]*a[i-p+1,i],f[i,j]}前i个数字j个乘号的最大值。 |
var f,a:array[0..10,0..10]of longint; s:string; i,n,k,j,p:longint; function max(a,b:longint):longint; begin ifa>b then exit(a); exit(b); end; begin assign(input,'p315.in');reset(input); assign(output,'p315.out');rewrite(output); readln(n,k); readln(s); fori:=1 to n do begin a[i,i]:=ord(s[i])-ord('0'); for j:=i+1 to n do a[i,j]:=a[i,j-1]*10+ord(s[j])-ord('0'); end; fori:=1 to n do f[i,0]:=a[1,i]; fori:=1 to n do forj:=1 to k-1 do for p:=1 to i-1 do f[i,j]:=max(f[i-p,j-1]*a[i-p+1,i],f[i,j]); writeln(f[n,k-1]); close(input);close(output); end.题目来源:《算法设计与分析》第三章动态规划
相关文章推荐
- 动态规划——看似dp的贪心问题最大乘积(蓝桥杯试题集)
- 最大K乘积问题(DP专题)
- 最大k乘积问题(dp)
- C语言使用DP动态规划思想解最大K乘积与乘积最大问题
- 最大K乘积问题(DP专题)
- 1209 -- 乘积最大问题
- HDU1087 【DP问题之最大递增子段和问题】
- 乘积最大<DP><C++>
- 最大子串乘积问题
- [swust 1741] 最长递增子序列问题(DP,最大流)
- 动态规划(DP)——HDU1081、PKU1050 To The Max 最大子矩阵问题
- JAVA代码—算法基础:最大连续子数组乘积问题
- HDU 1231 最大连续子序列 &&HDU 1003Max Sum (区间dp问题)
- 最大子矩阵问题(dp)
- 动态规划:HDU1864-最大报销额(处理带小数的dp问题)
- Dp_关于最大子矩阵的问题总结
- RQNOJ 311 [NOIP2000]乘积最大:划分型dp
- hdu 4975 最大流解决行列和求矩阵问题,用到矩阵dp优化
- 最大连续子序列和,乘积,最长递增子串,最长公共子串,子序列等问题(动态规划等)
- 微软面试题---求子数组最大乘积问题