动态规划之最大K乘积(实验报告版)
来源:互联网 发布:天猫双十一销售额数据 编辑:程序博客网 时间:2024/06/05 17:59
西 安 邮 电 大 学
(计算机学院)
课内实验报告
实验名称: 最大K乘积
专业名称: 计算机科学与技术
班 级: 计科1202
学生姓名: ——————
学号(8位):————————
指导教师: ————————
实验日期: 2015年5月12日
1.
上机题目及实验环境
1.1上机题目:最大k乘积问题
1.2实验环境:
操作系统:Microsoft Windows XP
软件平台:Microsoft Visual C++
2. 算法设计与分析
设w(h,k) 表示从第1位到第k位所组成的十进制数;
设m(i,j)表示前i位分成j段所得的最大乘积;
则可得到如下经典的DP方程:
if(j==1)
m(i,j) = w(1,i) ;
if(j >1 && j<=i )
m(i,j) = m(d,j-1)*w(d+1,i) //其中: 1<=d< i (即从1开始一直到i-1 中找最大值
if(i < j)
m(i,j) = 0 ;
//i一直小于等于n,j一直小于等于k
3. 核心代码
void maxdp(int n,int k,int *a)
{ int i,j,d;
long temp,max;
for(i=1; i<= n ; i++) //分成1段
m[i][1] = w[1][i];
for(i=1 ; i<= n ; i++) //DP 过程
for(j=2; j<= k ; j++)
{
max = 0;
for(d=1; d < i ; d++)
if ( (temp = m[d][j-1]*w[d+1][i]) > max)
max = temp ;
m[i][j] = max ;
}
}
4. 运行与调试
5. 结果分析和小结
(1)对结果的分析。分析结果可以采用图或者表的形式给出。
n
k
num
最大K乘积
2
1
15
15
4
2
1123
336
5
2
11023
3306
(2)本次上机实验的收获、心得体会。
===
附录(Java源代码)
package com.mhc.learn;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
/**
* 最大K乘积
* @author mhc
*
*/
public class exp3 {
static int k,n,num;
static int M=10;
/**
* 从文件中解析出三个整数
*/
public void readFile(){
FileInputStream fis = null;
try {
fis = new FileInputStream(new File("/home/mhc/test/input.txt"));
byte[] buf = new byte[1024];
int read = -1;
StringBuffer sb = new StringBuffer();
while ((read= fis.read(buf))!=-1) {
sb.append(new String(buf));
}
String string = new String(sb);
n =Integer.parseInt( string.split(" ")[0]);
string = string.split(" ")[1];
k = Integer.parseInt(string.split("\n")[0]);
num = Integer.parseInt(string.split("\n")[1]);
System.out.println("n="+n);;
System.out.println("k="+k);;
System.out.println("num="+num);;
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
fis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/**
* 写文件
*/
public void writeFile(int k){
FileWriter fos = null;
try {
fos = new FileWriter(new File("/home/mhc/test/output.txt"), false);
fos.write(Integer.toString(k));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
fos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/**
* eg:
* n=4 k=2时
* m(4,2)=max(m(1,1)*w(2,4),m(2,1)*w(3,4),m(3,1)*w(4,4));
*/
public void maxDp(int n,int k,int [][]w,int [][] m){
int temp = 0;
for (int i = 1; i <=n ; i++) {
m[i][1] = w[1][i];
}
//DP过程
for (int i = 1; i <=n; i++) {
for (int j = 2; j <=k; j++) { //分成j段
int max = 0;
for (int d = j-1; d < i; d++) {
if((temp=m[d][j-1]*w[d+1][i])>max){
max = temp;//替换最大的值
}
}
m[i][j] = max;
}
}
for (int i = 1; i <=n; i++) {
for(int j=1;j<=n;j++){
System.out.print(m[i][j]+" ");
}
System.out.println();
}
}
public static void main(String[] args) {
exp3 e = new exp3();
e.readFile();
//将num分解为单个数字
int [] a = new int[M];
int x = num,n1=n;
System.out.println(x);
while(x!=0){
a[n1--] = x%10;//a[0]中未存值
x /=10;
}
//初始化矩阵
int [][] w = new int[M][M];
for (int i = 0; i < w.length; i++) {
w[i][i] = a[i];
for (int j = i+1; j <=n; j++) {
w[i][j] = w[i][j-1]*10 + a[j];
}
}
int [][] m = new int[M][M];
e.maxDp(n, k, w, m);
System.out.println("最大乘积是:"+m[n][k]);
e.writeFile(m[n][k]);
}
}
- 动态规划之最大K乘积(实验报告版)
- 动态规划之 最大k乘积
- 【动态规划】最大k乘积问题
- 乘积最大(动态规划)
- 动态规划之最大k乘积,编辑距离,k好数,节点选择,背包问题
- 最大乘积--动态规划
- 动态规划-乘积最大
- 动态规划:乘积最大
- noip2000乘积最大 (高精度,动态规划)
- 乘积最大(动态规划经典题)
- 最大k乘积(动态规划、n重for循环用while实现)
- 【动态规划】【RQNOJ】乘积最大
- codeves 动态规划 乘积最大
- Openjudge 2.6基本算法之动态规划:8782乘积最大
- Vijos P1347 乘积最大(动态规划,区间DP)
- 蓝桥杯 算法训练 乘积最大(动态规划)
- 最大连续子数组和、乘积(动态规划)
- 动态规划之大数乘积
- 黑马程序员JAVA笔记6--集合
- 设计模式之策略模式简要分析
- tableView - 编辑模式
- Poj 3104 Drying
- HBase表重命名
- 动态规划之最大K乘积(实验报告版)
- 合并通用静态库脚本
- 求最大公约数(欧几里得算法)
- 小Z解读:企业证书利用itms-services协议分发应用在蜂窝网络下的限制
- Java基础—集合框架
- HDU 2035 人见人爱A^B
- Java基础:异常捕获顺序
- 换主页轮播的主题图片(4、删除)---轻开电子商务系统(企业入门级B2C网站)
- Android 4.1-4.2 默认窗体旋转180 度代码