第二三章上机实践报告
第三章上机实验报告
1.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。
1.2 算法描述
#include <iostream>
#define N 102
using namespace std;
int f[N][N], a[N][N], n;
int ans;
int main(){
cin>>n;
int i,j;
for(int i = 0; i <N; i++){
for(int j = 0; j < N; j++){
a[i][j]=9999;
}
}
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++){
cin>>a[i][j];
}
for(int i=1;i<=n;i++){
for (int j=1;j<=n;j++){
if(i==1&&j==1) f[1][1]=a[1][1];
else if (i==1){
f[1][j]=f[1][j-1]+a[1][j];
}
else if(j==1){
f[i][1]=f[i-1][1]+a[i][1];
}
else {
f[i][j]=min(f[i][j-1],f[i-1][j])+a[i][j];
}
}
}
cout<< f[n][n];
return 0;
}
1.3 问题求解
1.3.1 根据最优子结构性质,列出递归方程式。
1.3. 2 给出填表法中表的维度,填表顺序,填表范围。
二维表
i行:1~n j 列:n~1 在第一行和第一列中填入很大的数
从左到右 从上到下
1.3.3 分析该算法的时间和空间复杂度
时间复杂度:0(n^2)
空间复杂度:0(n^2)
1.3.4 心得体会
边界条件很重要,要理清楚边界条件和越界的问题。
2.1 你对动态规划算法的理解与体会
求解动态规划问题时要先列出递归方程式,明白方程式中数组代表的东西,还要注意边界问题。
第二章上机实验报告
1.1 问题描述
7-2 二分法求函数的零点 (30 分)
- 有函数:f(x)=x5−15x4+85x3−225x2+274x−121 已知f(1.5)>0,f(2.4)<0 且方程f(x)=0 在区间[1.5,2.4] 有且只有一个根,请用二分法求出该根。 提示:判断函数是否为0,使用表达式 fabs(f(x)) < 1e-7
输入格式:
无。
输出格式:x
该方程在区间[1.5,2.4]中的根。要求四舍五入到小数点后6位。。
1.2 算法描述
#include<iostream>
using namespace std;
int bsearch(int x,int a[],int left,int right)
{
if(left>right)
return -1;
int mid=(left+right)/2;
if(x==a[mid])
return mid;
if(x<a[mid])
return bsearch(x,a,mid+1,right);
else
return bsearch(x,a,left,mid-1);
}
int main()
{
int n,x;
int a[10];
cin >> n >> x;
for(int i=0;i<n;i++)
{
cin >> a[i];
}
cout << bsearch(x,a,0,n-1);
}
1.3 算法的时间和空间复杂度
时间复杂度:O(logn)
空间复杂度:O(logn)
1.4 心得体会
递归算法是比较好用的算法,但是要多练才能熟练掌握和运用。
1.5 对分治法的个人思考与感悟
分治法可以将较大的问题一步一步分解为较小的子问题,从解决较小的子问题慢慢解决大的问题,会比较容易。