第二第三章上机实验报告

1.题目:二分法求函数的零点

总时间限制:
1000ms
内存限制:
65536kB
描述
有函数:

f(x) = x5 - 15 * x4+ 85 * x3- 225 * x2+ 274 * x - 121

已知 f(1.5) > 0 , f(2.4) < 0 且方程 f(x) = 0 在区间 [1.5,2.4] 有且只有一个根,请用二分法求出该根。

输入
无。
输出
该方程在区间[1.5,2.4]中的根。要求四舍五入到小数点后6位。
样例输入
无
样例输出
不提供

2.算法描述

使用二分法,由题可知,这个函数在[1.5,2.4]内单调递减,当f(x)>0时,将mid+1赋给左边界left;当f(x)<0时将mid-1赋给右边界right。通过不断地取left,right的中值,进行查找比较,当right,left之间的距离小于1e-7时停止,此时的f(mid)为0或非常接近0,mid则为所求的根。

void bSearch(double left, double right) {
	if (fabs(right - left) > 1e-7) {
		mid = (left + right) / 2;
		if (f(mid) > 0)
		    return bSearch(mid+1, right);
		if (f(mid) < 0)
		    return bSearch(left, mid-1);
	}
}

3.算法时间和空间复杂度分析

时间复杂度:采用分治策略,分解子问题的时间复杂度为O(1),每个子问题的规模为n/2,则解决子问题所需时间为T(n/2),所以T(n)=O(1)+T(n/2)=O(logn)

空间复杂度:该算法用了递归,每次递归中需要的空间是一个常量,并不会随着n的变化而变化,每次递归的空间复杂度就是O(1)。又递归深度为logn,所以该算法的空间复杂度为O(1*logn)=O(logn)

 

4.心得体会

二分法是一个很好的算法,但是上机的时候还是很不熟练,不断地看书和询问同学,打完后确实有了很深的印象

5.对分治法的个人思考和感悟

二分法可以把一个很大的范围通过二分,不断的缩小查找的范围,查找速度很快

 

第三章

1 问题描述

7-3 最低通行费 (25 分)

一个商人穿过一个N×N的正方形的网格,去参加一个非常重要的商务活动。他要从网格的左上角进,右下角出。每穿越中间1个小方格,都要花费1个单位时间。商人必须在(2N-1)个单位时间穿越出去。而在经过中间的每个小方格时,都需要缴纳一定的费用。

这个商人期望在规定时间内用最少费用穿越出去。请问至少需要多少费用?

注意:不能对角穿越各个小方格(即,只能向上下左右四个方向移动且不能离开网格)。

输入格式:

第一行是一个整数,表示正方形的宽度N (1≤N<100);

后面N行,每行N个不大于100的整数,为网格上每个小方格的费用。

输出格式:

至少需要的费用。

输入样例:

5
1  4  6  8  10 
2  5  7  15 17 
6  8  9  18 20 
10 11 12 19 21 
20 23 25 29 33
结尾无空行

输出样例:

109
结尾无空行

样例中,最小值为109=1+2+5+7+9+12+19+21+33。

2 算法描述

#include<iostream>
using namespace std;
const int N=101;
int w[N][N],f[N][N];
int main()
{
int n;
cin >> n;
for(int i =1 ; i<=n;++i)
{
for(int j=1 ; j<=n ; ++j)
cin >> w[i][j];
}
for(int i=2 ; i<=n ; ++i)
{
f[i][0]=f[0][i]=100000000;
}
for(int i=1 ; i<=n ; ++i)
{
for(int j=1 ; j<=n ; ++j)
{
f[i][j] = min(f[i-1][j],f[i][j-1])+w[i][j];
}
}
cout<<f[n][n];
return 0;

}

3.问题求解


题目的要求是在2n-1个时间单位内完成这个程序,那么只能往下或往右走,那么我们就比较下面和右边的费用哪个最小,可以得到递归方程f[i][j] = min(f[i-1][j],f[i][j-1])+w[i][j];对他的边界分析,是最左上方的点,填表是从左到右,从上往下填表。

 

4.时间复杂度和空间复杂度

时间复杂度O(n^2)

空间复杂度O(n^2)

 

5.心得体会

阅读好问题,写出思路,写出需要的递归方程式求解,其次固定下来的点是哪些,解决边界问题,其实当时还不太清楚什么叫边界问题,后面看了北航老师的讲解明白了。

 

6.你对动态规划算法的理解与体会

动态规划算法是我们找到最优解的一个很好的算法,解决此类问题,要找到方法,然后写出这个方法的递归方程,来方便求解。

 

 

posted @ 2021-11-01 18:15  吴婉琳  阅读(65)  评论(0)    收藏  举报