算法实验 动态规划上机
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验3动态规划上机
[实验目的]
1.掌握动态规划的基本思想和效率分析方法;
2.掌握使用动态规划算法的基本步骤;
3.学会利用动态规划解决实际问题。
[实验要求]
按以下实验内容完成题目,并把编译、运行过程中出现的问题以及解决方法填入实验报告中,按时上交。
[实验学时] 2学时。
[实验内容]
一、实验内容
利用动态规划算法编程求解多段图问题,要求读入多段图,考虑多段图的排序方式,求源点到汇点的最小成本路径。并请对自己的程序进行复杂性分析。
二、算法描述
先输入点的个数和路径数以及每段路径的起点、长度、终点,再计算所有路径的值大小,比较输出后最小值。
三、源程序
#define N 2147483647
#include
#include
void main()
{
int i,pointnum,j;
cout<<"输入图中点的个数:"< cin>>pointnum; int **array; //array数组描述多段图 int *array2; //array2记录距离起点的最小路径 int *array3; //array3记录上一点编号 array=new int*[pointnum]; array2=new int[pointnum+1]; array3=new int[pointnum+1]; for(i=0;i { array[i]=new int[pointnum]; array2[i]=N; array3[i]=N; } array2[pointnum]=N; array3[pointnum]=N; for(i=0;i { for(j=0;j { array[i][j]=N; } } cout<<"输入多段图中路径条数"< int pathnum; cin>>pathnum; int a,k; cout<<"依次输入图中每段路径"< array2[1]=0; array3[1]=0; for(k=0;k { cin>>i; cin>>a; cin>>j; array[i][j]=a; if(array2[j]>(a+array2[i])) { array3[j]=i; array2[j]=a+array2[i]; } // cout< } k=0; i=pointnum; for(;;) { if(array3[i]!=0) { k++; i=array3[i]; } else break; } // cout< int *array4; array4=new int[k+1]; i=pointnum; for(j=k;j>=0;j--) { array4[j]=i; i=array3[i]; if(i==0) break; } i=pointnum; cout< cout< for(j=0;j<=k;j++) { cout< } cout<<"]"< } 四、程序的复杂度分析 O(n)= n²=16 五、程序运行结果及截图