最大利润-城市A和B
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的更多相关文章
- 全景智慧城市——NOW!!!VRSHOPPING颠覆你的购物认知!
互联网+时代,人们对现有的网络资源已经不再感冒,一般的图片.文字信息已经无法满足人们对互联网的需求,虚拟现实.身临其境的体验是不可小觑的发展趋势,尤其是VR逛街.购物,更会深入人心,再次改变人们的生活 ...
- BSOJ3760||洛谷P1453 城市环路 题解
城市环路 Description 一座城市,往往会被人们划分为几个区域,例如住宅区.商业区.工业区等等.B市就被分为了以下的两个区域——城市中心和城市郊区.在着这两个区域的中间是一条围绕B市的环路,环 ...
- [cnblog新闻]阿里的营业利润3倍于亚马逊,但为何市值只是亚马逊的一半?
阿里的营业利润3倍于亚马逊,但为何市值只是亚马逊的一半? 投递人 itwriter 发布于 2019-01-26 16:52 评论(0) 有688人阅读 原文链接 [收藏] « » http://ww ...
- 分析苹果代充产业链 汇率差+退款造就三线城市千万富翁_中新游戏研究_Joynews中新游戏
分析苹果代充产业链 汇率差+退款造就三线城市千万富翁_中新游戏研究_Joynews中新游戏 CNG:近日有媒体曝出8月22日这一天,有一家淘宝店卖出了351张面值4000南非南特的App Store ...
- 洛谷 P1453 城市环路 ( 基环树树形dp )
题目链接 题目背景 一座城市,往往会被人们划分为几个区域,例如住宅区.商业区.工业区等等.B市就被分为了以下的两个区域--城市中心和城市郊区.在着这两个区域的中间是一条围绕B市的环路,环路之内便是B市 ...
- P1453 城市环路
题目背景 一座城市,往往会被人们划分为几个区域,例如住宅区.商业区.工业区等等.B市就被分为了以下的两个区域——城市中心和城市郊区.在着这两个区域的中间是一条围绕B市的环路,环路之内便是B市中心. 题 ...
- [转帖]UCloud上市:利润暴跌84%、成本居高不下,结构化调整迫在眉睫
UCloud上市:利润暴跌84%.成本居高不下,结构化调整迫在眉睫 https://www.iyiou.com/p/116317.html [ 亿欧导读 ] 日前,上交所科创板上市委召开第27 ...
- luogu P1453 城市环路
题目描述 整个城市可以看做一个N个点,N条边的单圈图(保证图连通),唯一的环便是绕城的环路.保证环上任意两点有且只有2条路径互通.图中的其它部分皆隶属城市郊区. 现在,有一位名叫Jim的同学想在B市开 ...
- 【开源】分享2011-2015年全国城市历史天气数据库【Sqlite+C#访问程序】
由于个人研究需要,需要采集天气历史数据,前一篇文章:C#+HtmlAgilityPack+XPath带你采集数据(以采集天气数据为例子),介绍了基本的采集思路和核心代码,经过1个星期的采集,历史数据库 ...
随机推荐
- windows服务和进程的区别和联系
Windows Service 是主要用于服务器环境而长期运行的应用程序, 这类程序不需要有用户界面或者任何模拟输出. 任何的用户消息通常都是记录在Windows 事件日志里.Windows Serv ...
- Unreal引擎术语表
转自:http://www.cnblogs.com/hmxp8/archive/2012/02/10/2345274.html Unreal引擎术语表 转载自UDN: Actor - 一个可以放置在 ...
- RS-485收发的零延时转换电路
转自:http://www.dzsc.com/data/html/2007-5-28/41097.html RS-485是一种基于差分信号传送的串行通信链路层协议.它解决了RS-232协议传输距离太近 ...
- uboot启动参数设置分类及方法
一.nfs启动内核与根文件系统,内核与根文件系统都在nfs上 bootargs=noinitrd root=/dev/nfs rw nfsroot=192.168.0.1:/home/tekkaman ...
- 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 ...
- 关于ArcGis for javascrept之Map类
ArcGis for javascrept_ESRI_Map类: 1. 构造方法:esri.Map(); 参数: extent 如果设置了该选项,一旦这个选项的投影被设置,那么所有的图层都在定义的投 ...
- mongodb创建.bat快捷方式
1.在mongodb安装目录下找到bin文件下的mongod.exe 复制路径,然后创建startmongodb.bat文件 例如 cd C:\Program Files\MongoDB\Server ...
- ubuntu安装wget
ubuntu安装wget apt-get update apt-get install wget wget --version
- C++11新标准
1. 新类型 long long和unsigned long long: char16_t 和 char32_t: 新增原始字符串: 2. 统一的初始化 C++11扩大了用大括号括起的列表(初始化列表 ...
- p4555&bzoj2565 最长双回文串
传送门(洛谷) 传送门(bzoj) 题目 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为abc,逆序为cba,不相同). 输入长度为 nnn 的串 SSS ...