第二三章上机实践报告

第三章上机实验报告

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 对分治法的个人思考与感悟

分治法可以将较大的问题一步一步分解为较小的子问题,从解决较小的子问题慢慢解决大的问题,会比较容易。

posted @ 2021-10-31 22:14  林佩珊  阅读(19)  评论(0编辑  收藏  举报