合工大程序设计艺术与方法 实验四 动态规划
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;
}