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. windows服务和进程的区别和联系

    Windows Service 是主要用于服务器环境而长期运行的应用程序, 这类程序不需要有用户界面或者任何模拟输出. 任何的用户消息通常都是记录在Windows 事件日志里.Windows Serv ...

  2. Unreal引擎术语表

    转自:http://www.cnblogs.com/hmxp8/archive/2012/02/10/2345274.html Unreal引擎术语表 转载自UDN: ‍Actor - 一个可以放置在 ...

  3. RS-485收发的零延时转换电路

    转自:http://www.dzsc.com/data/html/2007-5-28/41097.html RS-485是一种基于差分信号传送的串行通信链路层协议.它解决了RS-232协议传输距离太近 ...

  4. uboot启动参数设置分类及方法

    一.nfs启动内核与根文件系统,内核与根文件系统都在nfs上 bootargs=noinitrd root=/dev/nfs rw nfsroot=192.168.0.1:/home/tekkaman ...

  5. numpy.ones(shape, dtype=None, order='C')

    Return a new array of given shape and type, filled with ones. Parameters: shape : int or sequence of ...

  6. 关于ArcGis for javascrept之Map类

    ArcGis for javascrept_ESRI_Map类:  1. 构造方法:esri.Map(); 参数: extent 如果设置了该选项,一旦这个选项的投影被设置,那么所有的图层都在定义的投 ...

  7. mongodb创建.bat快捷方式

    1.在mongodb安装目录下找到bin文件下的mongod.exe 复制路径,然后创建startmongodb.bat文件 例如 cd C:\Program Files\MongoDB\Server ...

  8. ubuntu安装wget

    ubuntu安装wget apt-get update apt-get install wget wget --version

  9. C++11新标准

    1. 新类型 long long和unsigned long long: char16_t 和 char32_t: 新增原始字符串: 2. 统一的初始化 C++11扩大了用大括号括起的列表(初始化列表 ...

  10. p4555&bzoj2565 最长双回文串

    传送门(洛谷) 传送门(bzoj) 题目 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为abc,逆序为cba,不相同). 输入长度为 nnn 的串 SSS ...