投资策略规划)你所掌握的算法知识帮助你从Acme计算机公司获得了一份令人兴奋的工作,签约奖金1万美元。你决定利用这笔钱进行投资,目标是10年后获得最大回报。你决定请Amalgamated投资公司管理你的投资,该公司的投资回报规则如下。该公司提供nnn种不同的投资产品,从111~nnn编号。在第jjj年,第iii种投资产品的回报率为rijr_{ij}rij​。换句话说,如果你在第jjj年在第iii种投资产品投入ddd美元,那么在第jjj年年底,你会得到d⋅rijd·r_{ij}d⋅rij​美元。回报率是有保证的,即未来10年每种投资产品的回报率均已知。你每年只能做出一次投资决定。在每年年底,你既可以将钱继续投入到上一年选择的投资产品中,也可以转移到其他投资产品中(转移到已有的投资产品,或者新的投资产品)。如果跨年时你不做投资转移,需要支付f1f_1f1​美元的费用。否则,需要支付f2f_2f2​美元的费用,其中f2>f1f_2 > f_1f2​>f1​。
  a. 如上所述,本问题允许你每年将钱投入到多种投资产品中。证明:存在最优投资策略,每年都将所有钱投入到单一投资产品中(记住最优投资策略只需最大化10年的回报,无需关心任何其他目标,如最小化风险)。
  b. 证明:规划最优投资策略问题具有最优子结构性质。
  c. 设计最优投资策略规划算法,分析算法时间复杂度。
  d. 假定Amalgamated投资公司在上述规则上又加入了新的限制条款,在任何时刻你都不能在任何单一投资产品中投入15000美元以上。证明:最大化10年回报问题不再具有最优子结构性质。
  
  
  a.
  这里做一个简要的说明,分三种情况。
  (1) 每一年都做投资转移的情况
  这种情况下,显然每一年都应当选择回报率最大的那一款投资产品,才能使得10年总收益最大化。这里假设了每一年回报率最大的投资产品都不一样。
  (2) 每一年都不做投资转移的情况
  假设每年都选择固定的一种投资产品。选择第1种投资产品的10年总收益为E1E_1E1​,选择第2种投资产品的10年总收益为E2E_2E2​,… …,选择第nnn种投资产品的10年总收益为EnE_nEn​。如果选择的是两种投资产品k1k1k1和k2k2k2,那么10年总收益必然是Ek1E_{k1}Ek1​与Ek2E_{k2}Ek2​的加权和,不会超过Ek1E_{k1}Ek1​与Ek2E_{k2}Ek2​中的较大者。因此,每年只选择一种投资产品所获得的总收益,不会比选择多种投资产品所获得的总收益要少。故在每一年都不做投资转移的情况下,每年只选择一种投资产品可以得到最大化收益。
  (3) 某些年份做投资转移,某些年份不做投资转移
  如果将连续不做投资转移的年份看做一个子问题,那么这个子问题属于情况(2),在这些连续的年份之中都只选择一种投资产品,可以得到这个子问题的最大化收益。
  再将连续不做投资转移的年份合并为一个整体,我们可以将这个整体也当做一年。这样每一处有连续不做投资转移的年份都看做是一年。现在来看整个问题,其中的每一年都做了投资转移,这属于情况(1)。每一年都选择单一的投资产品也可得到最大化收益。
  综上所述,无论做不做投资转移,在每一年都选择单一的投资产品,10年后可以得到最大化收益。
  
  b.
  用e[i,j]e[i, j]e[i,j]表示在第jjj年选择第iii种投资产品的前提下,前jjj年总的最大化收益。分析e[i,j]e[i, j]e[i,j]需要考虑两种情况:
  1) 第jjj年不做投资转移
  这种情况下,第j−1j-1j−1年也必须选择第iii种投资产品。此时e1[i,j]=(e[i,j−1]−f1)⋅rije_1[i, j] = (e[i, j-1] - f_1) · r_{ij}e1​[i,j]=(e[i,j−1]−f1​)⋅rij​。
  2) 第jjj年做了投资转移
  这种情况下,第j−1j-1j−1年可以选择除iii种之外的其他任意一种投资产品,显然我们要从中选择使得前j−1j-1j−1年总收益最大的那种投资产品。故e2[i,j]=max1≤k≤n且k≠i{(e[k,j−1]−f2)⋅rij}e_2 [i,j]=max_{1≤k≤n且k≠i} \left\{(e[k,j-1]-f_2) · r_{ij}\right\}e2​[i,j]=max1≤k≤n且k̸​=i​{(e[k,j−1]−f2​)⋅rij​}。
  综合以上两种情况,e[i,j]e[i, j]e[i,j]应当取二者中的较大值,即e[i,j]=max{e1[i,j],e2[i,j]}e[i, j] = max\left\{e_1[i, j], e_2[i, j]\right\}e[i,j]=max{e1​[i,j],e2​[i,j]}。我们还需用一个数组p[i,j]p[i, j]p[i,j]来保存第j−1j-1j−1年选择哪种投资产品。
  从以上分析可以看出,规划最优投资策略问题具有最优子结构。因为求解第jjj年的最大化收益,依赖于第j−1j-1j−1年的最大化收益。
  
  c.
  
  该算法主要由一个3重循环构成,很容易得出它的时间复杂度为O(Mn2)O(Mn^2)O(Mn2)。这里的MMM指的是总的年数,题目中为10年。
  
  d.
  略
  
  本题相关的code链接。
  https://github.com/yangtzhou2012/Introduction_to_Algorithms_3rd/tree/master/Chapter15/Problems/Problem_15-10

算法导论 — 思考题15-10 投资策略规划相关推荐

  1. 算法导论 思考题1-1

    算法导论-思考题1-1 1-1(运行时间的比较)假设求解问题的算法需要 f(n)f(n)f(n)微秒(microseconds),对下表中每个函数f(n)f(n)f(n)和时间ttt可以确定在时间tt ...

  2. 给定一个n节点的二叉树,写出一个O(n)时间非递归过程,将该树每个节点关键字输出,可以使用一个栈作为辅助数据结构(算法导论第十章10.4-3)

    给定一个n节点的二叉树,写出一个O(n)时间非递归过程,将该树每个节点关键字输出,可以使用一个栈作为辅助数据结构 (算法导论第十章10.4-3) template<typename T> ...

  3. 给定一个n节点的二叉树,写出一个O(n)时间递归过程,将该树每个节点关键字输出(算法导论第十章10.4-2)

    给定一个n节点的二叉树,写出一个O(n)时间递归过程,将该树每个节点关键字输出 (算法导论第十章10.4-2) #include <iostream> template<typena ...

  4. 对一组同构对象用单数组表示法实现(算法导论第十章10.3-2)

    对一组同构对象用单数组表示法实现 (算法导论第十章10.3-2) 考虑到数据安全问题,多用了一个数组来处理安全问题. #ifndef C11LEARN_SINGULARGROUPSREPRESENTI ...

  5. 使用单项循环链表实现字典操作(算法导论第十章10.2-5题)

    使用单项循环链表实现字典操作(算法导论第十章10.2-5题) template<typename T> void insert(SingleCycleL<T> & l, ...

  6. 用一个单链表L实现一个队列(算法导论第十章10.2-3)

    用一个单链表L实现一个队列(算法导论第十章10.2-3) template<typename T> class HalfNode {public:T key;HalfNode* next; ...

  7. 用一个单链表L实现一个栈(算法导论第十章10.2-2题)

    用一个单链表L实现一个栈(算法导论第十章10.2-2题) template<typename T> class HalfNode {public:T key;HalfNode* next; ...

  8. 有序序列中的i个最大数(算法导论思考题9-1)

    有序序列中的i个最大数 (算法导论思考题9-1) a 时间复杂度O(nlgn+i) //总共时间复杂度O(nlgn+i) vector<int> i_largest_number_in_o ...

  9. 算法导论 思考题 9-3

    (小顺序统计量)要在n个数中选出第i个顺序统计量,SELECT在最坏情况下需要的比较次数T(n)满足T(n) = (n).但是,隐含在记号中的常数项是非常大的.当 i 相对于n来说很小时,我们可以实现 ...

最新文章

  1. 比特币现金基金会和Yeewallet达成合作,助力BCH传播
  2. 【分享】(性能优化)思考数据列表中“特殊的列”
  3. 网络推广——网络推广专员优化网站有秘诀!
  4. Spring cloud——Hystrix 原理解析
  5. python 表单中值为空的还需要传入么_牛掰!100行Python,自动动手打造一款多国语言翻译软件...
  6. 总结Vue中index.html、main.js、App.vue、index.js之间关系以及Vue项目加载流程
  7. 域中计算机与用户,域内计算机和用户获取实现vbs代码
  8. 34营销的三要素:真实诚信、诱饵引入、合理宣传
  9. Python之数据分析(算数平均值、加权平均值、最大值与最小值)
  10. Selenium2(WebDriver)总结(一)---启动浏览器、设置profile加载插件
  11. python之路_kindEditor编辑器及beautifulsoup模块
  12. Quartz.net 任务调度
  13. android手机下开发摄像头拍摄
  14. unity3D游戏开发十二之疯狂的小球
  15. 鸿蒙系统投影仪,投影仪有系统和无系统的区别 当贝OS好在哪里?体验完明白了!...
  16. PADS打开PCB文件时出现提示:发生严重的运行时错误。
  17. ai人工智能课程百度云_云AI就像核电
  18. I06-python菜鸟教程查漏补缺
  19. flex datagrid组件中添加别的组件
  20. buffer pool详解(free链表+flush链表+lru链表)

热门文章

  1. Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Filtered
  2. 2020年业务峰值提前3年出现,中国邮政上云实战经验谈
  3. 使用JSoup实现爬虫操作(爬取网页图片、文章内容)
  4. 开机自启(静态通知)
  5. 机器学习将会改变所有产业?未来之城将是人工智能的天下!
  6. FishC笔记—06 讲:Pyhon 之常用操作符
  7. 基于php的教务选课管理系统毕业设计
  8. 正版软件,官方授权。RadiAnt DICOM Viewer - 软件版 / CD/DVD版
  9. LeetCode(89):格雷编码 Gray Code(Java)
  10. RedFish模拟仿真调试