1.石子合并

任务描述

沿着河岸摆放 N 堆石子,现要将石子有次序地合并成一堆,规定每次只能选相邻的 2 堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分。 例如:4堆石子4,5,9,4,可以按(((4,5),9),4)合并。

  • 第一次合并得分是9分,合并之后石子堆是9,9,4
  • 第二次合并得分是18分,合并之后石子堆是18,4
  • 第三次合并得分是22分,合并之后石子堆是22
  • 三次合并总得分49

试设计出一个算法,计算出将 N 堆石子合并成 1堆的最小得分和最大得分。

测试说明

输入格式

数据的第 1行是正整数 N,表示有N 堆石子。

2行有 N 个整数,第i 个整数 ai​ 表示第i 堆石子的个数。

输出格式

输出共 2 行,第 1 行为最小得分,第 2行为最大得分。

样例输入

4 4 5 9 4

样例输出

44 54

提示

1≤N≤1000≤ai​≤20

思路:

例如:4堆石子4,5,9,4 

要知道从开头4合并到最后4的最小代价,就需要知道从4合并到9的最小代价再合并最后一个4.....由此知道递推关系:

dpmin[i][j] = min(dpmin[i][j], dpmin[i][k] + dpmin[k + 1][j] + sum*[i->j]);

其中d[i][j]表示把第i到j堆合并成一堆的最小代价,sum*[i->j]表示第i到第j堆的石子数量之和。

由转移方程,可以看出要按照长度j-i进行迭代求解。

dpmax也是一样,只是把每次找最小值改为每次取最大值。

注:主函数中数组是从1开始存的不是0!!!

代码:

#include <iostream>
#include <algorithm>
using namespace std;
//在主函数中数组下标是从1开始的void dpStone(int a[],int n){/**********   Begin   **********///补充代码完成功能const int INF = 0x3f3f3f3f;int dpmin[100][100], sum[100], dpmax[100][100];dpmin[n][n] = { {0} };//将数组初始化dpmax[n][n] = { {0} };sum[n] = { 0 };sum[1] = a[1];//设置第一个石子数量for (int i = 2; i <= n; i++){sum[i] = sum[i - 1] + a[i];//存从1到i的石子数量和}for (int v = 1; v <= n; v++) // 表示i到j的间距{for (int i = 1; i <= n - v; i++)//i表示行{int j = i + v;//j表示列int temp = sum[j] - (i > 1 ? sum[i - 1] : 0);//i=1的时候,sum取0,temp为从i-1到j的石子数量和dpmin[i][j] = INF;//将此处的dp设置为无穷大,便于下面找最小值时使用//dpmax不用设置,因为是求最大值,与0相比即可for (int k = i; k < j; k++){dpmin[i][j] = min(dpmin[i][j], dpmin[i][k] + dpmin[k + 1][j] + temp);//比较不同分段方式取最小值dpmax[i][j] = max(dpmax[i][j], dpmax[i][k] + dpmax[k + 1][j] + temp);//比较不同分段方式取最大值}}}printf("%d\n%d", dpmin[1][n], dpmax[1][n]);/**********   End   **********/}
int main()
{int n;int a[105];cin >> n;for (int i = 1; i <= n; i++)cin >> a[i];dpStone(a, n);return 0;}

可参考博客:http://t.csdn.cn/H0MBg

2.基因检测

任务描述

本关任务:找出两个串的最长公共子串的长度。

用一个字符串表示一段基因,例如:CTATGGGTTT。两段基因的相似度定义为它们所包含的最大公共子串的长度。

例如:CCTTGGTGGGC的最大公共子串为TGG,它的长度为3,则我们称CCTTGGTGGGC的相似度为3。 现给定两段基因,要求计算它们的相似度。

编程要求

在右侧编辑器中有一个函数Similar,它有两个参数str1str2,是两个字符串,长度不超过50

请你在这个函数中,计算并输出这两个字符串的相似度。

输入数据由评测系统读取,并传递给Similar函数。具体见测试说明。

测试说明

平台会对你编写的代码进行测试:

测试输入CCCCC TTTTTGGGGGCC 预期输出: 2

测试输入ACTGGG DDD 预期输出: 0

思路:

dp[i][j]存从主串1-i和子串1-j的最长公共子串的长度

dp[i][j] =dp[i - 1][j - 1] + 1,str1[i]=str2[j]

dp[i][j]=0,str1[i]!=str2[j]

代码:

#include <iostream>
#include <algorithm>
using namespace std;void Similar(char *str1,char *str2)
{/**********   Begin   **********///补充代码完成任务int dp[50][50];//dp[i][j]存从主串1-i和子串1-j的最长公共子串的长度int i = 0, j = 0;int max = 0, zichuan = 0;while (str2[j] != '\0'){i = 0;while (str1[i] != '\0'){if (str1[i] == str2[j]){dp[i][j] = (i >= 1 && j >= 1) ? dp[i - 1][j - 1] + 1 : 1;//数组从0开始的,防止数组越界}elsedp[i][j] = 0;if (dp[i][j] > max)//更新最大值max = dp[i][j];i++;}j++;}cout << max << endl;return;/**********   End   **********/
}
int main()
{char str1[55],str2[55];while(cin >> str1 >> str2)Similar(str1,str2);
}

第3关:药剂稀释

任务描述

本关任务:找出一个序列中的最长下降子序列其中的元素个数。

医院里有一种药剂,其可以稀释成不同的浓度供病人使用,并且对于已知浓度的该药剂,使用时只能稀释不能增加浓度。

由于这种药需求量较大,同一瓶药剂只能给某个病人以及排在他后面的若干人使用。不同的病人对药物的浓度要求可能不同。

现在为了最大限度的利用每一瓶药剂(不考虑容量),已知n个病人所需药物浓度的序列,请计算出一瓶药剂能最多使用的人数。

编程要求

在右侧编辑器中有一个函数Cal,它有两个参数arrn

arr中包含n个病人对药物浓度的要求。

请你在这个函数中补充代码,计算并输出一瓶药剂能最多使用的人数。

输入数据由评测系统读取,并传递给Cal函数。具体见测试说明

测试说明

平台会对你编写的代码进行测试:

测试输入6 0.7 0.9 0.6 0.8 0.8 0.4

预期输出4

每组输入有两行,第一行有一个数n,第二行的n个数为数组的内容。

思路:

要知道0.7可用的病人,就要找浓度比0.7小的0.6可用的病人...即找到最后一种浓度0.4能用的病人只能为1后,在向上找0.8...等所能用的病人数

注,一种药剂最少一个人使用,且药剂稀释后不能增加浓度,且只能给后面的病人使用

得dp[i]=max(dp[i],dp[j]+1),arr[j]<arr[i]

代码:

#include <iostream>
#include <algorithm>
using namespace std;void Cal(double arr[],int n)
{/**********   Begin   **********///补充代码完成任务int dp[105];//dp存以该药物为首可用的病人数for (int i = 0; i < n; i++)dp[i] = 1;int dan = 0;for (int i = n-2; i >=0; i--)//i为dp数组下标,j为arr下标{for (int j = n - 1; j > i; j--){if (arr[i] >= arr[j]){dp[i] = max(dp[i], dp[j] + 1);}}}for (int i = 0; i < n; i++)dan = max(dan, dp[i]);cout << dan << endl;/**********   End   **********/
}
int main()
{double arr[105];int n;while(cin >> n){for(int i=0; i<n; i++) cin >> arr[i];Cal(arr,n);}return 0;
}

第4关:找相似串

任务描述

本关任务:找出最接近的相似串。

一般情况下,度量两个串S1S2的相似性,可以通过从一个串变换成另一个串所需要的最少操作次数来衡量,需要的操作次数越少,则越相似。

假设从一个串变化成另一个串所允许的操作只有两种:插入一个字符或者删除一个字符。无论是插入还是删除一个符号,均算作一次操作。

现给你一个串S,和一个串的集合T,让你找出集合T中与S最相似的串。

编程要求

右侧编辑器中有一个函数Similar,请在这个函数中读取数据完成任务。

输入数据由学员处理。输入的第一行为一个串S,第二行是一个整数n,范围0 < n < 20,表示接下来集合T中的串的个数。接下来n行,每行为一个串。

:所有字符串的长度不超过50

请输出T中与S最相似的串,如果有多个就输出多个串(按照输入时的顺序),每个串占一行。具体见测试说明

测试说明

平台会对你编写的代码进行测试:

测试输入abcd 4 abd abdc abed aebcd

预期输出abd aebcd

提示: 对于第一个串abd,在b后插入一个c就可以变成abcd,操作次数为1次。 第二个串abdc,删除d后面的c,在d前面增加一个c,即可变成abcd,操作次数为2次。 第三个串abed,删除d前面的e,在d前面增加一个c,即可变成abcd,操作次数为2次。 第四个串aebcd,删除a后面的e即可变成abcd,操作次数为1

算法思路

对一个子串来说:

i = 0时,dp[0][j] = j;

j = 0时,dp[i][0] = i;

a[i] == b[j]时,dp[i][j] = d[i-1][j-1];

a[i] != b[j]时,有两种操作,要么删除一个串的字符,要么添加一个串的字符,都记为一次操作,dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + 1

代码:

#include <iostream>
#include <cstring>
using namespace std;
const int MAX = 50;
void Similar()
{/**********   Begin   **********///补充代码完成功能char s[MAX];int n,end;cin >> s>>n;//读取主串和子串个数int len_s = strlen(s);char arr[20][MAX];int caozuo[20];//存操作次数int dp[MAX][MAX];//用数组dp[i][j]表示,子串从1-i转换到主串的操作数。for (int i = 0; i < n; i++)//读取子串{cin>>arr[i];} for (int i = 0; i < len_s; i++){dp[0][i] = i;}for (int k = 0; k < n; k++)//第k个子串{int len = strlen(arr[k]);//子串长度//初始化for (int j = 0; j < len; j++)dp[j][0] = j;for (int i = 1; i < len_s; i++)//i为主串下标{for (int j = 1; j < len; j++)//j为子串下标{if (s[i] == arr[k][j])dp[i][j] = dp[i - 1][j - 1];elsedp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + 1;}}caozuo[k] = dp[len_s-1][len-1];//存每个子串的最小操作数}end = caozuo[0];for (int i = 1; i < n; i++)end = min(end, caozuo[i]);for (int i = 0; i < n; i++){if (caozuo[i] == end)cout << arr[i] << endl;}/**********   End   **********/
}
int main()
{Similar();
}

第5关:聪明的寻宝人

任务描述

本关任务:计算寻宝人所能带走的宝物的最大价值。

一个寻宝人在沙漠中发现一处神秘的宝藏,宝藏中共有n个宝物(n不超过20),每个宝物的重量不同,价值也不同,宝物i的重量是wi,其价值为vi

寻宝人所能拿走的宝物的总重量为mm不超过50)。请帮助寻宝人写一个程序,计算寻宝人能够获得的最大总价值。

编程要求

在右侧编辑器中有一个函数MaxValue,它有四个参数valuesweightsnm

valuesweights分别存放了n件宝物的价值重量m为寻宝人所能携带的最大重量。

请在这个函数中补充代码,计算并输出寻宝人所能获得的最大总价值。

输入数据由评测系统读取,并传递给MaxValue函数。具体见测试说明

测试说明

平台会对你编写的代码进行测试:

测试输入3 10 3 4 4 5 5 6

预期输出11

每组输入有多行,第一行有两个数nm,分别为宝石数量寻宝人载重。下面有n行数据,每一行有两个数,分别是宝石重量宝石价值

思路:

是一个0-1背包问题

0-1背包问题参考博客:http://t.csdn.cn/hIcEL

代码:

#include <iostream>
using namespace std;void MaxValue(int values[],int weights[],int n,int m)
{/**********   Begin   **********///补充代码完成任务int dp[30][30];//for (int i = 0; i < 30; i++){dp[0][i] = 0;dp[i][0] = 0;}for (int i = 1; i <= n; i++){for (int j = 1; j <= m; j++){if (j >= weights[i]){dp[i][j] = max(dp[i-1][j], dp[i - 1][j - weights[i]] + values[i]);}else{dp[i][j] = dp[i - 1][j];}}}cout << dp[n][m] << endl;/**********   End   **********/
}
int main()
{int vs[30],ws[30],n,m;while(cin >> n >> m){for(int s =1;s <= n;s++)cin >> ws[s] >> vs[s];MaxValue(vs,ws,n,m);}
}

以上为个人见解,有问题还请指正

算法设计与分析实验---动态规划相关推荐

  1. 计算机算法设计与分析 动态规划 实验报告,动态规划法解最长公共子序列(计算机算法设计与分析实验报告).doc...

    动态规划法解最长公共子序列(计算机算法设计与分析实验报告) 实报 告 实验名称:任课教师::姓 名:完成日期:二.主要实验内容及要求: 要求按动态规划法原理求解问题: 要求交互输入两个序列数据: 要求 ...

  2. 太原理工大学linux与python编程r实验报告_太原理工大学算法设计与分析实验报告...

    <太原理工大学算法设计与分析实验报告>由会员分享,可在线阅读,更多相关<太原理工大学算法设计与分析实验报告(12页珍藏版)>请在人人文库网上搜索. 1.本科实验报告课程名称: ...

  3. 算法设计与分析实验指导(完整版)

    算法设计与分析实验指导 文章目录 算法设计与分析实验指导 1. 快速排序及第k小数 1.1 快速排序 1.1.1 Implementation 1 1.1.2 算法特性分析 1.1.3 Improve ...

  4. C/C++ 算法设计与分析实验报告

    算法设计与分析实验报告 算法实验整体框架的构建 菜单代码块 选择函数代码块 主函数代码块 实验模块Ⅰ:算法分析基础--Fibonacci序列问题 实验解析 Fibonacci序列问题代码块 实验模块Ⅱ ...

  5. 格雷码算法c语言实验报告,算法设计与分析实验报告

    本科生实验报告 课程名称:算法设计与分析 实验项目:递归和分治算法 实验地点:计算机系实验楼110 专业课:物联网1601学生.2016002105 学生姓名:于 指导员:郝晓丽 2018年5月4日 ...

  6. 深大算法设计与分析实验二——分治法求最近点对问题

    源代码: 深大算法设计与分析实验二--分治法求最近点对问题代码-C/C++文档类资源-CSDN下载 目录 实验问题 一.实验目的: 二.内容: 三.算法思想提示 产生不重复的随机点算法: 蛮力算法: ...

  7. 算法设计与分析:动态规划(3)-序列联配问题(以算代存)

    文章目录 前言 高级动态规划 应用分治思想减少空间 计算得分 从后缀匹配到前缀匹配 伪代码 分治点计算改进 总结 本文参考UCAS卜东波老师算法设计与分析课程撰写 前言 本文内容承接上一次算法设计与分 ...

  8. 【图的着色问题】算法设计与分析实验1

    计算机科学与工程学院实验报告 课程名称 算法设计与分析 班级 实验内容 实验1:图的着色问题 指导教师 姓名 重剑DS 学号 实验日期 2022.04.28 一.问题描述,含输入.输出数据内容.格式 ...

  9. 【图的同构识别】算法设计与分析实验2

    计算机科学与工程学院实验报告 课程名称 算法设计与分析 班级 实验内容 实验2:图的同构识别 指导教师 姓名 重剑DS 学号 实验日期 2022.05.19 一.问题描述,含输入.输出数据内容.格式 ...

最新文章

  1. HDOJ-1062 Text Reverse
  2. SAP RETAIL Rapid Replenishment
  3. [翻译]一步步教你配置SQL SERVER合并复制(五)配置Publisher(上)
  4. Linux-鸟菜-6-文件搜索
  5. 2-09 CentOS系统参数优化
  6. python中数字是常量吗,【python】常量与变量
  7. Hyper-V虚拟机自动添加检查点和导出备份
  8. phpexcel.php linux,phpexcel在linux系统报错如何解决
  9. Spring对不同来源的Resources的支持
  10. Linux安装与配置
  11. javascript 函数定义的方式
  12. Mesos和Marathon下容器无法正常部署可能的原因
  13. c语言报告 实验环境怎么写,C语言实验报告
  14. msconfig蓝屏_电脑msconfig改动后蓝屏怎么修复
  15. java 上传文件接口_Java接口实现文件上传
  16. java实现将.acc格式转化为mp3格式
  17. 【ADNI】数据预处理(2)获取 subject slices
  18. 关于印发《计算机技术与软件专业技术资格(水平)考试暂行规定》
  19. PIXI 精灵表和精灵动画
  20. fowin自动交易和量化交易和合约交易

热门文章

  1. 关于Vue的MVVM
  2. 2021年焊工(技师)考试资料及焊工(技师)试题及解析
  3. 五十一个经典小故事4
  4. 微电子所等在二维材料异质结构光电器件研究中取得进展
  5. 钉钉小程序父组件调用子组件方法(钉钉小程序踩坑实录)
  6. 第十七章 Unity 预制件prefab(下)
  7. 注解@AllArgsConstructor @NoArgsConstructor是 什么意思
  8. SICNUOJ——meng新计划要求规范
  9. python获取当前年月日_Python获取、格式化当前时间日期的方法
  10. C#实现图片从数据库的上传和下载