动态规划之最大K乘积(实验报告版)

来源:互联网 发布:天猫双十一销售额数据 编辑:程序博客网 时间:2024/06/05 17:59

 

西 安 邮 电 大 学

            (计算机学院)

 

课内实验报告

 

实验名称:     最大K乘积

    专业名称: 计算机科学与技术

班    级: 计科1202

    学生姓名:   ——————

学号(8位):————————

指导教师:    ————————

实验日期:       2015512

 

 

 

 

 

 

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]);

}

}

 

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 网易我的世界密码账号都忘了怎么办 我的世界创建世界画面乱码了怎么办 网易我的世界云端存档不够用怎么办 玩刺激战场带耳机声音有延迟怎么办 我的世界手机版狼变色怎么办 我的世界开了光影太阳太刺眼怎么办 我的世界饥饿值掉的慢怎么办 我的世界合装备过于昂贵怎么办 我的世界故事模式屏幕是黑的怎么办 人物只剩下轮廓的图用ps怎么办 两年义务兵考军校分数不够怎么办 大学生兵考上军校后原学籍怎么办 我的世界工业附魔到精准采集怎么办 交换生在台期间遗失通行证怎么办 驾驶证上的号码是士兵证号怎么办 士兵证丢了但是要买飞机票怎么办 君泰保安公司不发工资怎么办 冬天洗棉衣后有一圈白色怎么办 买了一批化肥没有执行标准怎么办 防护栏下面打不了膨胀螺丝怎么办 不知道怀孕照了x射线怎么办 腹部照了x光片照了三次怎么办 像在工厂戴的静电帽弄丢了怎么办 诈骗犯把钱被转到别人账户怎么办 狗狗5个月在家随地大小便怎么办 上课放屁放的快没憋到老是放怎么办 丈夫有外遇并跟小三有一儿子怎么办 借款夫妻双亡借出去的钱怎么办? 橡胶底的劳保鞋开胶了怎么办? 求部队停止有偿服务内部超市怎么办 晋江买了全本还是有防盗章节怎么办 宝宝没有穿衣服的地方长疙瘩怎么办 詹姆斯士兵12魔术贴老是掉怎么办 手机版本不支持陌陌视频聊天怎么办 私人单位不给员工写收入证明怎么办 cad图形缩小后找不到图了怎么办 离婚了老婆嫁给了别人怎么办 对方开车撞伤人逃逸不赔钱怎么办 帮老板开车撞伤人老板不愿赔怎么办 我开车撞人现在伤者住院怎么办 B照驾驶证扣3分怎么办l