1,问题描述

jack每天同时只能在A和B其中一个城市工作赚钱,假设两个城市间的交通费为m。已知每天在A 和 B 能赚到多少钱,那么jack怎么选择每天工作的城市才能赚到最大利润。

比如 moneyA = {1,2,3,4,3,1};moneyB = {2,1,3,4,2,1};m = 1。

2,边界条件:无

3,思路:假设某一天jack在A城市工作,那么接下来怎么选择到最后一个才能赚到最多,在B城市类似。然后形成递归。

4,代码实现

1)简单递归

     public static void main(String[] args) {
int[] cityA = {1,2,4,5,6,3,1};
int[] cityB = {2,3,4,5,1,1,2};
int res = Math.max(mostMoney(cityA, cityB, 1, 0), mostMoney(cityB, cityA, 1, 0));
System.out.println("res: " + res);
} public static int mostMoney(int[] curCity, int[] nextCity, int m, int idx) {
if (idx >= curCity.length) {
return 0;
} int moneyCur = mostMoney(curCity, nextCity, m, idx + 1);
int moneyNext = mostMoney(nextCity, curCity, m, idx + 1) - m;
return curCity[idx] + Math.max(moneyCur, moneyNext);
}

2)其实在递归时在某一个点能获取的最大利润重复计算,所以获得该最大利润后需记录下来cache,下次直接用,这就是动态规划DP。

     private static int[] recA;
private static int[] recB;
public static void main(String[] args) {
int[] cityA = {1,2,4,5,6,3,1};
int[] cityB = {2,3,4,5,1,1,2};
recA = new int[cityA.length];
recB = new int[cityB.length];
recA[0] = mostMoney(cityA, cityB, true, 1, 0);
recB[0] = mostMoney(cityB, cityA, false, 1, 0);
int res = Math.max(recA[0], recB[0]);
System.out.println("res: " + res);
System.out.println("recA: " + Arrays.toString(recA));
System.out.println("recB: " + Arrays.toString(recB));
} public static int mostMoney(int[] curCity, int[] nextCity, boolean isCityA, int m, int idx) {
if (idx >= curCity.length) {
return 0;
}
if (isCityA && recA[idx] != 0) {
return recA[idx];
} else if (recB[idx] != 0) {
return recB[idx];
} int moneyCur = mostMoney(curCity, nextCity, isCityA, m, idx + 1);
int moneyNext = mostMoney(nextCity, curCity, !isCityA, m, idx + 1) - m;
int mostCur = curCity[idx] + Math.max(moneyCur, moneyNext);
if (isCityA == true) {
recA[idx] = mostCur;
} else {
recB[idx] = mostCur;
} return mostCur;
}

3)记录下来之后,写成非递归形式

     private static int[] recA;
private static int[] recB;
public static void main(String[] args) {
int[] cityA = {1,2,4,5,6,3,1};
int[] cityB = {2,3,4,5,1,1,2};
int m = 1;
recA = new int[cityA.length];
recB = new int[cityB.length];
recA[cityA.length - 1] = cityA[cityA.length - 1];
recB[cityB.length - 1] = cityB[cityB.length - 1];
for (int i = cityA.length - 2; i >= 0; i--) {
recA[i] = cityA[i] + Math.max(recA[i + 1], recB[i + 1] - m);
recB[i] = cityB[i] + Math.max(recA[i + 1] - m, recB[i + 1]);
}
int res = Math.max(recA[0], recB[0]);
System.out.println("res: " + res);
System.out.println("recA: " + Arrays.toString(recA));
System.out.println("recB: " + Arrays.toString(recB));
}

5,时间复杂度:非递归形式是O(n)

6,api:无

最大利润-城市A和B的更多相关文章

  1. 全景智慧城市——NOW!!!VRSHOPPING颠覆你的购物认知!

    互联网+时代,人们对现有的网络资源已经不再感冒,一般的图片.文字信息已经无法满足人们对互联网的需求,虚拟现实.身临其境的体验是不可小觑的发展趋势,尤其是VR逛街.购物,更会深入人心,再次改变人们的生活 ...

  2. BSOJ3760||洛谷P1453 城市环路 题解

    城市环路 Description 一座城市,往往会被人们划分为几个区域,例如住宅区.商业区.工业区等等.B市就被分为了以下的两个区域——城市中心和城市郊区.在着这两个区域的中间是一条围绕B市的环路,环 ...

  3. [cnblog新闻]阿里的营业利润3倍于亚马逊,但为何市值只是亚马逊的一半?

    阿里的营业利润3倍于亚马逊,但为何市值只是亚马逊的一半? 投递人 itwriter 发布于 2019-01-26 16:52 评论(0) 有688人阅读 原文链接 [收藏] « » http://ww ...

  4. 分析苹果代充产业链 汇率差+退款造就三线城市千万富翁‍_中新游戏研究_Joynews中新游戏

    分析苹果代充产业链 汇率差+退款造就三线城市千万富翁‍_中新游戏研究_Joynews中新游戏 CNG:近日有媒体曝出8月22日这一天,有一家淘宝店卖出了351张面值4000南非南特的App Store ...

  5. 洛谷 P1453 城市环路 ( 基环树树形dp )

    题目链接 题目背景 一座城市,往往会被人们划分为几个区域,例如住宅区.商业区.工业区等等.B市就被分为了以下的两个区域--城市中心和城市郊区.在着这两个区域的中间是一条围绕B市的环路,环路之内便是B市 ...

  6. P1453 城市环路

    题目背景 一座城市,往往会被人们划分为几个区域,例如住宅区.商业区.工业区等等.B市就被分为了以下的两个区域——城市中心和城市郊区.在着这两个区域的中间是一条围绕B市的环路,环路之内便是B市中心. 题 ...

  7. [转帖]UCloud上市:利润暴跌84%、成本居高不下,结构化调整迫在眉睫

    UCloud上市:利润暴跌84%.成本居高不下,结构化调整迫在眉睫 https://www.iyiou.com/p/116317.html     [ 亿欧导读 ] 日前,上交所科创板上市委召开第27 ...

  8. luogu P1453 城市环路

    题目描述 整个城市可以看做一个N个点,N条边的单圈图(保证图连通),唯一的环便是绕城的环路.保证环上任意两点有且只有2条路径互通.图中的其它部分皆隶属城市郊区. 现在,有一位名叫Jim的同学想在B市开 ...

  9. 【开源】分享2011-2015年全国城市历史天气数据库【Sqlite+C#访问程序】

    由于个人研究需要,需要采集天气历史数据,前一篇文章:C#+HtmlAgilityPack+XPath带你采集数据(以采集天气数据为例子),介绍了基本的采集思路和核心代码,经过1个星期的采集,历史数据库 ...

随机推荐

  1. 如何在开启了log-bin的MySQL Server中创建FUNCTION

    在MySQL主从复制机器的master的数据库中创建function,报出如下错误: Error Code: 1418. This function has none of DETERMINISTIC ...

  2. NetScaler VPX在Azure上的部署(一)

    本文将介绍NetScaler的VPX部署在Azure China上.包括如何通过vhd文件上传.创建虚拟机,以及如何部署VPX. 一.首先将VHD文件解压,放到目录D:\Azure中.VHD文件的获得 ...

  3. 【转】 Pro Android学习笔记(七九):服务(4):远程服务的实现

    目录(?)[-] 远程服务的实现小例子 对外开放远程服务的接口 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flow ...

  4. Ruby代码块(Block)

    1.什么是代码块 在Ruby中,{}或do...end之间的代码是一个代码块.代码块只能出现在一个方法的后边,它紧接在方法最后一个参数的同一行上,由yield关键字调用.例如: [1,2,3,4,5] ...

  5. Ruby中print、p、puts的区别

    三个方法的作用都是将一个字符串打印到控制台  比较项目  puts  print p   换行符 末尾添加换行符  末尾不加换行符  末尾添加换行符  非字符串对象的输出  调用该对象的to_s方法 ...

  6. linux日常管理-系统进程查看工具-ps

    查看系统有那些进程 命令有ps aux 和命令 ps -elf USER  哪个用户使用了这个进程 PID  进程的id %CPU 占用CPU的百分比 %MEM 占用内存的百分比 VSZ 虚拟内存的大 ...

  7. Centos 7安装与配置chef

    背景:随着DevOps 逐渐流行起来,越来越多的工作需要自动化处理,而chef就是其中一款能实现自动化管理的工具,掌握类似chef这样的自动化工具,相信会使你在未来的竞争中更具优势. 俗话说“好记性不 ...

  8. [51nod1119]机器人走方格V2

    解题关键: 1.此题用dp的方法可以看出,dp矩阵为杨辉三角,通过总结,可以得出 答案的解为$C_{n + m - 2}^{n - 1}$ 2.此题可用组合数学的思想考虑,总的步数一共有$n+m-2$ ...

  9. 功能:formatter 表单提交 拼接参数的形式

    datagarid的formatter属性 value: 代表当前单元格中的值.row:代表当前行.index: 代表当前行的下标. {field:'is_hot',title:'是否热门',widt ...

  10. unreal3对象管理模块分析

    凡是稍微大一点的引擎框架,必然都要自己搞一套对象管理机制,如mfc.qt.glib等等,unreal自然也不例外. 究其原因,还是c++这种静态语言天生的不足,缺乏运行时类型操作功能,对于复杂庞大的逻 ...