合工大程序设计艺术与方法 实验四 动态规划

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《程序设计艺术与方法》课程实验报告

LCSLength(str1, str2,i,j);

cout << "最长子序列为:" << endl;

Print(str1, i, j, m, n);

cout << endl;

cout << "最长子序列长度为:" << Long[m][n] << endl;;

system("pause");

}

int _tmain(int argc, _TCHAR* argv[])

{

LCS();

return 0;

}

2.字符串的变换:

使用动态规划的思想:

定义两个数组,Distance表示距离,handle表示操作,其中handle存储的数1为删除,2为插入,3为替换,4为相同跳到下一个字符,5为结束状态。

先初始化,令handle开始的第一行第一列为5,如果str1[i] != str2[0],handle为3,列同理;其中Distance为对应的行号或者列号。

两重for循环遍历所有组合的点,如果str1[i] == str2[j],则Distance[i][j] = Distance[i - 1][j - 1],handle[i][j] = 4;否则handle[i][j] = minval(Distance[i - 1][j] + 1, Distance[i][j - 1] + 1, Distance[i - 1][j - 1] + 1, Distance[i][j]); minval函数的作用是比较最大值,并返回最大值对应的操作,1为删除,2为插入,3为替换,当循环结束时,在Distance[m-1][n-1](m,n分别为两字符串的长度)中存储着最少操作次数

输出步骤:

最后先递归,后操作,修改str1字符串,表示操作的步骤。

#include "stdafx.h"

#include

#include

#include

#include

using namespace std;

#define MAX 1000

int Distance[MAX][MAX];

3.计算所有的子矩阵中和的最大值

使用动态规划:

使用一个二维数组,其中num[i][j]存储矩阵i*j的元素和。num存储的方法是:num[i][j] += num[i - 1][j];循环输入后就得到了矩阵元素和的二维数组。使用三个变量i,j,k来遍历,一个矩阵大小是M*N的,那么使i从0到M,再使j从每一个i到M,遍历所有行可能。再考虑列方向,直接在每一种i,j组合下,进行0到N的遍历,那么这样就等于是把所有子矩阵的情形给遍历完了。

每次遍历的过程是:从i,j点开始,temp = num[j][k] - num[i - 1][k],表示行为i-1到j,列为1到k的矩阵的值,nummax = max(nummax , 0) + temp表示i-1到j,列为1到k的矩阵中从k向上最大的子矩阵元素和,Max = max(nummax , Max)表示最大的子矩阵和,当遍历结束,就可以求出最大举证和。

思考:本算法可以求出100*100的矩阵

#include "stdafx.h"

#include

#include

#include

#include

#include

int _tmain(int argc, _TCHAR* argv[]) {

subMatrix();

return 0;

}

相关文档
最新文档