第二第三章上机实验报告
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.你对动态规划算法的理解与体会
动态规划算法是我们找到最优解的一个很好的算法,解决此类问题,要找到方法,然后写出这个方法的递归方程,来方便求解。
浙公网安备 33010602011771号