收藏 分享(赏)

2016算法课程设计题目12个.doc

上传人:精品资料 文档编号:8343215 上传时间:2019-06-21 格式:DOC 页数:27 大小:540.18KB
下载 相关 举报
2016算法课程设计题目12个.doc_第1页
第1页 / 共27页
2016算法课程设计题目12个.doc_第2页
第2页 / 共27页
2016算法课程设计题目12个.doc_第3页
第3页 / 共27页
2016算法课程设计题目12个.doc_第4页
第4页 / 共27页
2016算法课程设计题目12个.doc_第5页
第5页 / 共27页
点击查看更多>>
资源描述

1、1、打包行李宰勋每次不到旅行前日都绝不会打包行李,今天也是到了登机的前一天才坐下来开始打包的。航空公司规定每人只能携带 1 件行李,而宰勋要带的东西比较多, 1 个行李箱肯定是不够的。下面的目录列出了他想要带的每件物品的体积和必要程度。物品 笔记本电脑 相机 XBOX365 咖啡研磨机 哑铃 百科全书体积 4 2 6 4 2 10必要程度 7 10 6 7 5 4因行李箱的空间有限,所以能够放进去的物品总体积不能超过 w。编写程序计算出必要程度总和最大的物品目录。示例输入值:26 10laptop 4 7camera 2 10xbox 6 6grinder 4 7dumbbell 2 5enc

2、yclopedia 10 46 17laptop 4 7camera 2 10xbox 6 6grinder 4 7dumbbell 2 5encyclopedia 10 4示例输出值:24 3laptopcameragrinder30 4laptopcameraxboxgrinder2、计算第 k 个答案摩尔斯电码字典在没有电话的时代,摩尔斯电码是无线电传输领域中的一种常用代码。电码以短信号(短点,o )和长信号(长点,-)的不同组合表示各种文字。例如:o表示英文字母 J,而 表示英文字母 M。假设有一本以 n 个长点和 m(n、m X+YFY- FX+Y根据上面的替换式,就有如下的 1、2

3、 代龙曲线字符串。第一代:FX+YF第二代:FX+YF+FX-YF我们想要求出第 n 代龙曲线字符串。不过,考虑到答案有可能很长,所以只想计算出第 p 个字符起始长度为 l 个字符的字符串。请编写程序实现这种功能。输入第一行输入测试用例的个数 C(C#include using namespace std;/ KMP 算法,pat 长度由 len_pat 指定 void get_next(const char pat, int next, int pat_len) / int len = strlen(pat);int len = pat_len;int i,j; next0 = -1;for

4、(i=1; i=0 j=nextj);if(j store;/ 切分 pat 到 store 中 PAT_INFO info;bool new_info = true;for(i=0; i 0) info = store.front();for(i=0; i=0)字符。2. 匹配规则要求匹配最大的字符子串,例如 a*d,匹配 abbdd 而非 abbd,即最大匹配子串。3. 匹配后的输入串不再进行匹配,从当前匹配后的字符串重新匹配其他字符串。我们先考虑 rule 是否匹配 input 某一个前缀的情况的情况相关动态规划算法如下:设状态 dpij为 rulei与 inputj是否匹配(true

5、或 false)分别考虑 rulei=?,*以及普通字符的情况rulei=*时:1. dpij-1=true 能推出 diij=true 但是 dpij-1=false 不能推出 dpij=false(考虑 rule0.i=abc*和 input0.j-1=ab 且 inputj=c。所以不能用 dpij-12. 应该用 dpi-1j和 dpi-1j-1。其实是一样的,因为 dpi-1k=true 即可推出 dpij=true(其中 0B 的动态转移方程为 dpij = max(dpi-1j,dpij-1) + aij; 由于,同理可得 B 的情况,那么,题目的意思是 A-B 然后 B - A

6、 我们可以假设同时从 A 点出发,得到两条不同路径,这个是一样的效果。所以,我们可以得到一个动态转移方程dpijpq = max(dpi-1jp-1q,dpi-1jpq,dpij-1p-1q,dpij-1pq-1) 因为 每次只能移动一步,即 i+1 或 j+1 那么 i+j 是移动的步数 因为从 A点开始移动的,经过相同的步数,肯定能得到 i+j = p+q还有一点要注意一下,这题与 NYOJ 61 是同类问题,但是,有一点细节要注意,最后终点的值也要算上,上面的动态方程得到的值不包含两个 A 和 B 的值,因为 A 是起点,所以,他的值一般是 0,所以,得到最后的结果应该是 int sum

7、 = max(dpm-1nm-1n,dpm-1nmn-1,dpmn-1m-1n,dpmn-1mn-1) + amn; AC 代码:#include#include#includeusing namespace std;int a6060;int dp60606060;int max(int n,int m)return nm?n:m;int main()int i,j,T,n,m;scanf(“%d“,while(T-)scanf(“%d %d“,for(i=0;in;i+)for(j=0;jm;j+)scanf(“%d“,memset(dp,0,sizeof(dp);for(i=0;in;i+)for(j=0;jm;j+)for(p=i+1;pn;p+) q=i+j-p; if(q = 0) continue; dpijpq = max(max(dpi-1jp-1q,dpij-1pq-1), max(dpi-1jpq-1,dpij-1p-1q) + aij + apq; int sum = max(max(dpm-1nm-1n,dpm-1nmn-1), max(dpmn-1m-1n,dpmn-1mn-1); printf(“%dn“,sum+amn); return 0;

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报