FZU_1208_最大k乘积问题
2015-08-01 08:47
423 查看
Time Limit: 1000 mSec Memory Limit : 32768 KB
Problem Description
设I是一个n位十进制整数。如果将I划分为k段,则可得到k个整数。这k个整数的乘积称为I的一个k乘积。试设计一个算法,对于给定的I和k,求出I的最大k乘积。对于给定的I和k,编程计算I的最大k乘积。
Input
输入文件由多组数据组成。每组数据格式如下:第1行中有2个正整数n和k。正整数n是序列的长度;正整数k是分割的断数。
接下来的一行中是一个n位十进制整数。(n<=10)
Output
对于每组数据,输出计算出的最大k乘积。
Sample Input
2 115
Sample Output
15w[i][j]表示从第i位到第j位可以得到的数,,m[i][j]表示l取到第i位,已经分了j段的最优解
m[i][j]=m[d][j-1]*m[d+1][i] 1<d<i
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
int n,k;
char a[12];
long long w[20][20],m[20][20];
void call(int n)
{
long long temp=0;
for(int i=1;i<=n;i++) w[i][i]=a[i]-'0';
for(int j=1;j<=n;j++)
{
w[1][j]=a[j]-'0'+temp;
temp+=a[j]-'0';
temp*=10;
}
long long cmp=0;
for(int i=2;i<=n;i++)
{
cmp=a[i]-'0';cmp*=10;
for(int j=i+1;j<=n;j++)
{
w[i][j]=a[j]-'0'+cmp;
cmp+=a[j]-'0';
cmp*=10;
}
}
/* for(int i=1 ; i<= n; i++)
{
for(int j=1 ; j<= n; j++)
printf("%d ",w[i][j]);
printf(" ");
}*/
}
void dp(int n)
{
long long lar;
for(int i=1;i<=n;i++) m[i][1]=w[1][i];
for(int i=1;i<=n;i++)
{
for(int j=2;j<=k;j++)
{
lar=0;
for(int d=1;d<i;d++)
{
if(m[d][j-1]*w[d+1][i]>lar)
lar=m[d][j-1]*w[d+1][i];
m[i][j]=lar;
}
}
}
}
int main()
{
freopen("1.in","r",stdin);
while(scanf("%d%d",&n,&k)!=EOF)
{
memset(w,0,sizeof(w));
memset(m,0,sizeof(m));
scanf("%s",a+1);
call(n);
dp(n);
printf("%I64d\n",m
[k]);
}
return 0;
}
相关文章推荐
- 设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。
- HDU 1232 畅通工程
- uva-133 - The Dole Queue
- MSTSC远程终端中一个实用小技巧
- 【CSS学习】CSS 表格
- 利用GEPHI做网页排名计算
- html页面里table导出为excel
- unity3d android开发初体验——远程安装调试篇
- HTTP 方法:GET 对比 POST
- iOS设计模式 - 装饰
- Android如何获取选择图片时的文件绝对路径方法
- jQuery动态添加删除select项(实现代码)
- UML读书笔记——01组件化设计
- spring实现java的邮件发送
- KNIMI数据挖掘建模与分析系列_004_利用KNIMI做客户流失预测
- 【android控件学习笔记】ListView
- [leetcode 32]Longest Valid Parentheses
- 请问什么是UTF字符串?
- Spring Data MongoDB 三:基本文档查询(Query、BasicQuery)(一)
- Quora 是如何维持高质量代码的