算法设计与分析—动态规划例题

这篇具有很好参考价值的文章主要介绍了算法设计与分析—动态规划例题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

问题A:FIB数列(备忘录)

题目描述

求FIB数列第n项的值

输入

输入一个整数n,表示需要输出FIB数列第n项的值

输出

输出FIB数列第n项的值

样例输入

 复制

6
样例输出

 复制

8
提示
#include "stdio.h"
double a[100]; // 0号单元不用,全局变量如果没有初始化,则其值默认为0 
double f(int n){
	if (n<=2){
		 
	}
	else {
		
	}
}
int main(void){
	int n;
	scanf("%d",&n);
	printf("%.0lf\n",f(n));
}
#include "stdio.h"
 double a[100]; // 0号单元不用,全局变量如果没有初始化,则其值默认为0 
double f(int n){ 	
     if (n<=2){ 	
          return a[n]=1;
	  	} 	
     else { 
           if(a[n-1]==0){
              a[n-1]=f(n-1);
           }  
           if(a[n-2]==0){
              a[n-2]=f(n-2);
           } 	
           a[n]=a[n-1]+a[n-2];
           return a[n]; 
   	} 
}
int main(void){ 
  	int n; 
  	scanf("%d",&n); 	
   printf("%.0lf\n",f(n));
}

问题B: 游艇问题

题目描述

长江游艇俱乐部在长江上设置了n (n<=10)个游艇出租站1,2,…,n。游客可在这些游艇出租站租用游艇,并在下游的任何一个游艇出租站归还游艇。游艇出租站i 到游艇出租站j 之间的租金为r(i,j),1≤i<j≤n。要求设计一个算法,计算出从游艇出租站1 到游艇出租站n 所需的最少租金(使用动态规划法)。
要求:
第1行输入1个整数,表示有n个出租站点。
第2行输入n-1个整数,依次表示第1个站点到第i(1<i<=n)个站点的租金。
第3行输入n-2整数,依次表示第2个站点到第i(2<i<=n)个站点的租金。
...
第n行输入1整数,依次表示第n-1个站点到第i(n-1<i<=n)个站点的租金。
最后1行直接输出第1个出租点到第n个出租点的最小租金。

输入

4
2  4  6
2  5
1

输出

5

样例输入

 复制

5
2  4  6  8
1  2  3
1  2
3
样例输出

 复制

5
提示
#include <stdio.h>

int m[11][11]; // 假设下标为0的位置不存储有效数据

int f(int n) {
	
	int i,j,k,p;

	for(i=1; i<=n; i++) m[i][i]=0; // 给主对角线(第1条对解线)赋值
        ___________________________ 
        return m[1][n];
}

int main(void) {
	
	int i,j,n,result; 
	
	scanf("%d",&n);

	for(i =1; i < n; i++ )
		for(j =i+1; j <= n; j++ )
			scanf("%d",&m[i][j]);

	result=f(n);

	printf("%d\n",result);

	return 0;
}
算法设计思路:先写出计算m[i][j]值的递归式,然后根据递归式设计动态规划算法。
另外,如果本题不用动态规划,而是直接利用递归求解,则可参考下列程序代码(当问题规模比较大时,该代码的执行效率较低)
 
#include <stdio.h> int m[11][11]; // 假设下标为0的位置不存储有效数据 int f(int i, int j) { if(i==j) { return 0; } else { int min=m[i][j]; for(int k=i+1; k<j; k++) { _______________ } return min;
       }
}

int main(void) {

	int i,j,n,result;

	scanf("%d",&n);

	for(i =1; i < n; i++ )
		for(j =i+1; j <= n; j++ )
			scanf("%d",&m[i][j]);

	result=f(1,n);

	printf("%d\n",result);

	return 0;
}
#include <stdio.h>

int m[11][11]; // 假设下标为0的位置不存储有效数据

int f(int n) {
    int i, j, k;
    
    for(i = 1; i <= n; i++)
        m[i][i] = 0; // 给主对角线(第1条对解线)赋值

    for(j = 2; j <= n; j++) {
        for(i = 1; i <= n-j+1; i++) {
            int min = m[i][i+j-1]; // 初始化最小租金为当前的租金值
            for(k = i+1; k < i+j-1; k++) {
                int temp = m[i][k] + m[k][i+j-1];
                if(temp < min)
                    min = temp;
            }
            m[i][i+j-1] = min; // 更新租金值
        }
    }
    
    return m[1][n];
}

int main(void) {
    int i, j, n, result;
    
    scanf("%d", &n);
    
    for(i = 1; i < n; i++)
        for(j = i+1; j <= n; j++)
            scanf("%d", &m[i][j]);
    
    result = f(n);
    
    printf("%d\n", result);
    
    return 0;
}

问题C:矩阵连乘积

题目描述

给定n(1<=n<=9)个矩阵{A1, A2, …, An},其中Ai 与Ai +1是可乘的,i=1,…,n。要求找到一个计算次序使得求 n个矩阵连乘积A1, A2, …, An的数乘次数最少。 例如:如果有3个矩阵,第1个矩阵的行数和列数分别为1和2,第2个矩阵的行数和列数分别为2和3,第3个矩阵的行数和列数分别为3和4;如果先计算第1个矩阵和第2个矩阵的积(数乘次数为6=1*2*3),然后再计算刚得到的结果矩阵(1行3列)与第3个矩阵的积(数乘次数为12=1*3*4),总数乘的结果为18;如果先计算第2个矩阵和第3个矩阵的积(数乘次数为24=2*3*4),然后再计算第1个矩阵与刚得到的结果矩阵(2行4列)的积(数乘次数为8=1*2*4),总数乘的结果为32。因为3个矩阵的连乘积的计算方法只有上面两种情况,故最少的数乘次数为18。

输入

第一行输入一个整数,表示有n个矩阵相乘
第二行输入n+1个整数,分别表示n个矩阵的行和列数。注意,相邻两个矩阵相乘的条件是前者的列数与后者的行数相等,故输入数据时省略了一个整数。

输出

第一行输出最小的数乘次数。

样例输入

 复制

3
1 2 3 4
样例输出

 复制文章来源地址https://www.toymoban.com/news/detail-849382.html

18
提示
#include <stdio.h>


int m[11][11]; // 下标为0的单元“不存储”有效数据
int p[11]; // 注意:下标为0的单元“存储”有效数据

void MatrixChain(int p[],int n)
{
	for(int i=1;i<=n;i++) m[i][i]=0; //初始化第1条对角线(主对角线)		
			
	for(int r=2;r<=n;r++) //分别计算第r(此处没有使用变量p的原因是p已经作为形式参数了)条对角线上的值
	{
		for(int i=1;i<=n-r+1;i++)		
		{
			
		}
	}
}

int main(void)
{
	int i,n,result;
	
	scanf("%d",&n);		
	for(i=0;i<=n;i++) scanf("%d",&p[i]);
	  	
	MatrixChain(p,n);
	
	printf("%d\n",m[1][n]);
	
	return 0;
}
算法设计思路:先写出计算m[i][j]值的递归式(与租用游艇问题非常相似),然后根据递归式设计动态规划算法。
如果是4个矩阵,下标分别是1,2,3,4,5,则结果应该是什么?
#include <stdio.h>

int m[11][11]; // 假设下标为0的位置不存储有效数据
int p[11]; // 注意:下标为0的位置存储有效数据

void MatrixChain(int p[], int n) {
    int i, j, k, r;

    for (i = 1; i <= n; i++)
        m[i][i] = 0; // 初始化第1条对角线(主对角线)

    for (r = 2; r <= n; r++) {
        for (i = 1; i <= n - r + 1; i++) {
            int j = i + r - 1;
            m[i][j] = m[i][i] + m[i + 1][j] + p[i - 1] * p[i] * p[j];  // 初始化m[i][j]值
            for (k = i + 1; k < j; k++) {
                int temp = m[i][k] + m[k + 1][j] + p[i - 1] * p[k] * p[j];
                if (temp < m[i][j])
                    m[i][j] = temp;  // 更新m[i][j]值
            }
        }
    }
}

int main(void) {
    int i, n, result;

    scanf("%d", &n);
    for (i = 0; i <= n; i++)
        scanf("%d", &p[i]);

    MatrixChain(p, n);

    printf("%d\n", m[1][n]);

    return 0;
}

到了这里,关于算法设计与分析—动态规划例题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 算法设计与分析之动态规划问题和具体实例

           动态规划(Dynamic Programming,DP)算法通常用于求解某种具有最优性质的问题。在这类问题中,可能会有许多可行解,每一个解都对应一个值,我们希望找到具有最优值的解。         动态规划算法与分治法类似,其基本思想也是将待求解的问题分解成若干个子问题,先

    2024年01月19日
    浏览(29)
  • 【计算机算法设计与分析】图像压缩问题(C++_动态规划)

    在计算机中常用像素点灰度值序列 { p 1 , p 2 , . . . , p n } { p_1, p_2, ..., p_n } { p 1 ​ , p 2 ​ , ... , p n ​ } 表示图像。其中整数 p i ( 1 ≤ i ≤ n ) p_i(1leq i leq n) p i ​ ( 1 ≤ i ≤ n ) ,表示像素点i的灰度值。通常灰度值的范围是0~255。因此,需要用8位表示一个像素。 图像的变位压

    2024年02月03日
    浏览(34)
  • 算法设计与分析实验二:动态规划法求解TSP问题和01背包问题

    【实验内容】 (1)tsp问题:利用动态规划算法编程求解TSP问题,并进行时间复杂性分析。 输入:n个城市,权值,任选一个城市出发; 输出:以表格形式输出结果,并给出向量解和最短路径长度。 (2)01背包问题:利用动态规划算法编程求解0-1背包问题,并进行时间复杂性分

    2024年02月03日
    浏览(45)
  • 湘潭大学 算法设计与分析实验 回溯 动态规划 贪心 模拟退火解决背包问题

    https://download.csdn.net/download/SQ_ZengYX/88620871 测试用例

    2024年02月02日
    浏览(45)
  • 算法设计与分析实验4 :利用动态规划的方法解决子集等和分割判断问题

    实验4  利用动态规划的方法解决子集等和分割判断问题 一、实验目的 1. 了解动态规划的主要思想。 2. 掌握背包问题解决方法用以解决该问题。 3. 分析核心代码的时间复杂度和空间复杂度。 二、实验内容和要求 题目:给定一个只包含正整数的非空数组。是否可以将这个数组

    2024年04月23日
    浏览(28)
  • 算法分析与设计-数字三角形问题(动态规划)(通俗易懂,附源码和图解,含时间复杂度分析)(c++)

    (一)题目 问题描述 给定一个由 n n n 行数字组成的数字三角形,如图所示。 试设计一个算法,计算从三角形的顶至底的一条路径,使该路径经过的数字总和最大。 算法设计 对于给定的由 n n n 行数字组成的数字三角形,计算从该三角形的顶至底的路径经过的数字和的最大值

    2023年04月10日
    浏览(30)
  • 【算法学习】斐波那契数列模型-动态规划

            我在算法学习过程中,针对斐波那契数列模型的动态规划的例题进行了一个整理,并且根据标准且可靠一点的动态规划解题思路进行求解类似的动归问题,来达到学习和今后复习的必要。         所谓的斐波那契数列模型,即当前状态的值等于前两种状态的值之和。

    2024年02月04日
    浏览(42)
  • [算法]动态规划以及常见例题

    之前买的假书害人捏......不过有个问题没说错,动态规划和递归很相似,但是动态规划利用分治法 ,把大问题转化为子任务,当计算出 一个子任务的结果将储存 起来, 避免对于同一个子任务的重复计算 但其实根据某本书的写法,就是给递归套了一层存储的壳子......这个做法其实其

    2024年02月04日
    浏览(31)
  • 算法分析与设计--动态规划

    一、动态规划简介 二、动态规划求解步骤 三、动态规划典型应用 数字三角形问题 最大子段和问题 0-1背包问题 四、最长公共子序列问题 动态规划求解 五、总结 算法语言--java语言 动态规划算法通常用于求解具有某种最优性质的问题。动态规划与分治算法类似,其基本思想也

    2024年02月07日
    浏览(53)
  • 算法设计与分析复习--动态规划

    算法设计与分析复习–递归与分治(二) 与分析法类似:将原问题分解为子问题 不同点:不是通过递归的方式,而是自底向上的求解问题 矩阵连乘的次数是左矩阵行列,右矩阵行列取出左右中进行相乘。 由于矩阵乘积需要满足左矩阵列等于右矩阵的行,所以可以用一维数组

    2024年02月04日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包