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. ECMAScript中面向对象的程序设计思想总结

    <JavaScript高级程序设计>Chapter6笔记 1.ECMAScript内部值属性:数据属性和访问器属性 1)数据属性 数据属性的4个特性: configurable:表示能否通 ...

  2. Logstash 2.0.0 beta2 发布,开源日志管理

    Logstash 是一个应用程序日志.事件的传输.处理.管理和搜索的平台.你可以用它来统一对应用程序日志进行收集管理,提供 Web 接口用于查询和统计. Logstash 现在是 ElasticSea ...

  3. 初识Luajit

    转自:http://www.cppblog.com/pwq1989/archive/2013/11/28/204487.html 大家可以从官网下载到源码(http://luajit.org/),也可 ...

  4. 九 fork/join CompletableFuture

    1: Fork/join fork/join:  fork是分叉的意思, join是合并的意思. Fork/Join框架:是JAVA7提供的一个用于并行执行任务的框架,是一个把大任务分割成若干个小任务 ...

  5. Spring 学习十四 Spring security安全

    Spring security: 我用过的安全机制:   oauth2, filter,  secured方法保护 9.2  保护web请求: 9.2.1  代理Servlet过滤器: Delegat ...

  6. SVD实例

    >> X = rand(5,7) X = 0.9797 0.1365 0.6614 0.5828 0.2259 0.2091 0.5678 0.2714 0.0118 0.2844 0.4 ...

  7. HTML DOM clearTimeout() 方法

    转自:http://www.w3school.com.cn/jsref/met_win_cleartimeout.asp 定义和用法 clearTimeout() 方法可取消由 setTimeout( ...

  8. redis-数据类型-string、hash、list、set、zset

    String 类型操作string是redis最基本的类型,而且string类型是二进制安全的.意思是redis的string可以包含任何数据.比如jpg图片或者序列化的对象. $redis-> ...

  9. service的生命周期以及两种service的差异

    可以看到,两种service的生命周期都相对简单,有一点不同的是,Intentservice每次调用的时候都执行onstartcommand,而boundservice一旦启动了之后,就不会每次执行o ...

  10. 荧光分子的dynamic quenching 和 通常说的quenching的区别?

    quenching有两种,学术上分为dynamic quenching 和static quenching,我们通常说的quenching就是 static quenching. static que ...