标签:第三章 递归 上机 int 复杂度 填表 实践 最优 1.1
1. 实践报告任选一题进行分析。内容包括:
1.1 问题描述
一个商人穿过一个N×N的正方形的网格,去参加一个非常重要的商务活动。他要从网格的左上角进,右下角出。每穿越中间1个小方格,都要花费1个单位时间。商人必须在(2N-1)个单位时间穿越出去。而在经过中间的每个小方格时,都需要缴纳一定的费用。
这个商人期望在规定时间内用最少费用穿越出去。请问至少需要多少费用?
注意:不能对角穿越各个小方格(即,只能向上下左右四个方向移动且不能离开网格)。
1.2 算法描述
#include<iostream>
#include<cmath>
using namespace std;
const int N=100;
int a[N][N],b[N][N];
int main()
{
int i,j,n;
cin>>n;
for (i=1;i<=n;i++){
for (j=1;j<=n;j++){
cin>>a[i][j];
}
}
for(int i=2;i<=n;i++){
b[0][i]=b[i][0]=10000000; //边界
}
for (i=1;i<=n;i++){
for (j=1;j<=n;j++){
b[i][j]=min(b[i-1][j],b[i][j-1])+a[i][j]; //递归
}
}
cout<<b[n][n]<<endl;
}
1.3 问题求解:
该问题要求最优解,而最优解与子问题的最优解有关,找出递归公式用带备忘录的递归方法求解。
1.1.1 根据最优子结构性质,列出递归方程式,
b[i][j]=min(b[i-1][j],b[i][j-1])+a[i][j]
1.1.2 给出填表法中表的维度、填表范围和填表顺序。
填表维度·:二维列表
填表范围:从第二行二列开始
填表顺序:从左到右从上到下
1.1.3 分析该算法的时间和空间复杂度
时间复杂度:因为有两个for循环从1到n所有时间复杂度为o(n*2)
空间复杂度:需要两个n行n列的二维数组来储存所以其空间复杂度为o(n*2)
1.3 心得体会(对本次实践收获及疑惑进行总结)
对于动态规划问题找出递归方程式以及分析填表的顺序,表的边界很重要。
2. 你对动态规划算法的理解和体会
动态规划算法的思想就是把大问题化为小问题
找到小问题的解决方案,合成大问题的解决方案,记录小问题的最优解决方案,以便于回溯寻找,降低时间复杂度。
标签:第三章,递归,上机,int,复杂度,填表,实践,最优,1.1 来源: https://www.cnblogs.com/seanxiao105/p/seanxiao-1005.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。