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. SQL Server:sp_send_dbmail参数设置

    sp_send_dbmail [ [ @profile_name = ] 'profile_name' ]    [ , [ @recipients = ] 'recipients [ ; n ]'  ...

  2. Ubuntu中Could not get lock /var/lib/dpkg/lock

    找出所有的 apt 以及 apt-get 进程: ps -A | grep apt-get 杀死进程: processnumbe 删除锁定文件: rm /var/lib/dpkg/loc 之后像下面这 ...

  3. python oop培训文档里面的 正宗oop、多个函数间反复return传参、多个文件无限复制粘贴扣字、无效废物滑稽类4种方式的例子。(2)

    把文档里面说的几种范式发出来. 4种编程范式实现一个人吃喝拉撒长身体的代码.语法很简单,思想模拟了所有程序员写代码时候的代码规划设计想法. 0.我不反对复制粘贴的写法,可以百度搜索复制粘贴网上现有的, ...

  4. numpy.mean和numpy.random.multivariate_normal(依据均值和协方差生成数据,提醒:计算协方差别忘了转置)

    >> import numpy as np >>> A1_mean = [1, 1] >>> A1_cov = [[2, .99], [1, 1]]&g ...

  5. hashcode和equals

    Java中集合(Collection):一类是List另外一类是Set: 区别:list中元素有序,可重复 Set元素无序,不能重复 如何保证元素不重复呢?Object.Equals 但是当添加的元素 ...

  6. 关于使用struts2跳转后css和js失效的解决方式

    根据观察,主要是由于通过action跳转后的url会根据命名空间,自动跳转到命名空间子目录,使得当前引用的css和js查找不到,从而失效,根据这个原因,可使用四种办法解决: 1.使用struts2.x ...

  7. 0009_if控制语句

    1.if 条件:                   (判断相等一定注意要用 ==  而不是 =) 代码块 else: 代码块 2.if 条件一: 代码块 elif 条件二: 代码块 elif 条件三 ...

  8. C语言连接mysql -insert-update

    C语言连接mysql数据库实现insert语句:数据库:test表:systeminfo CREATE TABLE `systeminfo` (  `id` int(11) NOT NULL AUTO ...

  9. [HDU3037]Saving Beans,插板法+lucas定理

    [基本解题思路] 将n个相同的元素排成一行,n个元素之间出现了(n-1)个空档,现在我们用(m-1)个“档板”插入(n-1)个空档中,就把n个元素隔成有序的m份,每个组依次按组序号分到对应位置的几个元 ...

  10. 使用showConfirmDialog显示确认框

    ------------------siwuxie095                                 工程名:TestJOptionPane 包名:com.siwuxie095.s ...