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

 

西 安 邮 电 大 学

            (计算机学院)

 

课内实验报告

 

实验名称:     最大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]);

}

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章