- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
最低通行费 输入 第一行是一个整数,表示正方形的宽度N (1 = N 100); 后面 N 行,每行 N 个不大于 100 的整数,为网格上每个小方格的费用。 输出 至少需要的费用。 分析 我们可以发现这道题目给我们提供了一段序列,我们需要做的就是每次选取一个断开的点,然后把问题递归地求解就可以了。 这就为我们的动规提供了条件:具有最优子结构性质。 我们需要做出的决策,仅仅是从当前序列中选取一个点作为当前子树的根节点,所以动规的转移是O(n)的。 状态的确定 我们用opt[i][j]表示在[i..j]区间内可以获得的最大加分,用root[i][j]表示[i..j]范围内选取哪个结点作为根时可以获得最大加分。 对区间[i,j](ij),我们定义opt[i][j]=1; 则有: opt[i][j]=max {opt[i][k-1]*opt[k+1][j]+value[k] | k=i,i+1,i+2..j} root[i][j]为对应的k值 int search(int l, int r) { if (opt[l][r] != 0) return opt[l][r]; for (int i = l; i = r; i++) if (search(l, i - 1) * search(i + 1, r) + value[i] opt[l][r]) { opt[l][r] = search(l, i - 1) * search(i + 1, r) + value[i]; root[l][r] = i; } } memset(opt, 0, sizeof(opt)); for (int i = 1; i = n + 1; i++) opt[i][i - 1] = 1; for (int i = 1; i = n; i++) opt[i][i] = value[i]; int Ans = search(1, n); 代码 上面几道题是区间动态规划的一些例题,它们的基础时间复杂度都是O(N3)的 聚会的快乐(Party) 你要组织一个由你公司的人参加的聚会。你希望聚会非常愉快,尽可能多地找些有趣的人。但是劝你不要同时邀请某个人和他的上司,因为这可能带来争吵。给定N个人(姓名,他幽默的系数,以及他上司的名字),找到能使幽默系数和最大的若干个人。 输入 第一行一个整数N(N100)。接下来有N行,每一行描述一个人,信息之间用空格隔开。姓名是长度不超过20的字符串。幽默系数是在0到100之间的整数 输出 邀请的人最大的幽默系数和 分析 仔细看过这个问题之后,会发现这道题目和我们上面遇到的一些类型的动态规划都有点区别:它的数据并不是以线性或者表格的形式, 而是以树的形式进行存储的。 可以发现,这道题目中的关系可以简单地描述为:在一棵树中,父亲结点和儿子结点不可以同时选取。而每个结点有一个权值,在满足上述条件的情况下求出可以选取出的最大值。 这就是我们所说的树形动态规划。由于树本身的递归性质,我们使用记忆化搜索的方法来完成子问题答案的存储。 状态的确定 显然,对于每个结点我们需要记录当前结点是否被取到,以及在该种情况下该子树所能获得的最大幽默系数。 因此,我们定义opt[1][i]表示在编号为i的结点必取的情况下以i为根的子树所能获得的最大快乐值;相应地,opt[0][i]表示在编号为i的结点不取的情况下以i为根的子树所能获得的最大幽默系数。 则根据题目中的要求,我们有 opt[1][i]=value[i] + Σopt[0][k](k为所有i的子结点的编号) opt[0][i]=Σmax{opt[0][k],opt[1][k]}(k为所有i的子结点的编号) w数组用来存储边; r[i]存放编号为i的结点的儿子数; d[i]中存放编号为i的结点的在w数组中最后一条边的编号,其中d[0]=0;d[i]=d[i-1]+r[i]; int search(int flag, int lab) { //记忆化搜索 if (opt[flag][lab] != 0) return opt[flag][lab]; int p = (flag == 1) ? value[lab] : 0; for (int i = d[lab - 1]; i = d[lab]; i++) if (flag == 1) p += search(0, w[i]); else p += max(search(0, w[i]), search(1, w[i])); opt[flag][lab] = p; return
您可能关注的文档
最近下载
- SQE工作思路与规划.pptx
- 2024年(高级)政工师理论考试题库及答案(含各题型) .docx
- 2024铁路工程投资控制系统操作手册.pdf VIP
- 临床诊断与治疗.ppt VIP
- 22 2024年香港华夏杯四年级竞赛初赛数学试卷.docx VIP
- 质量管理小组活动准则.pdf VIP
- 王杰:腾讯游戏SRE在复杂异构业务中的云原生服务实践.pdf VIP
- GB50030-2013 氧气站设计规范.docx VIP
- 2025四川九河环保集团有限责任公司下属宜宾市新绿能源有限责任公司第一批第二次员工招聘2人备考练习题库及答案解析.docx VIP
- 蒙德IMS-MF流伺服驱动器使用说明书.pdf VIP
文档评论(0)