Best Financing

Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 120    Accepted Submission(s): 24

Problem Description
小 A想通过合理投资银行理财产品达到收益最大化。已知小A在未来一段时间中的收入情况,描述为两个长度为n的整数数组dates和earnings,表示在 第dates[i]天小A收入earnings[i]元(0<=i<n)。银行推出的理财产品均为周期和收益确定的,可描述为长度为m的三个 整数数组start、finish和interest_rates, 若购买理财产品i(0<=i<m),需要在第start[i]天投入本金,在第finish[i]天可取回本金和收益,在这期间本金和收益都 无法取回,收益为本金*interest_rates[i]/100.0。当天取得的收入或理财产品到期取回的本金当天即可购买理财产品(注意:不考虑复 利,即购买理财产品获得的收益不能用于购买后续的理财产品)。假定闲置的钱没有其他收益,如活期收益等,所有收益只能通过购买这些理财产品获得。求小A可 以获得的最大收益。

限制条件:
1<=n<=2500
1<=m<=2500
对于任意i(0<=i<n),1<=dates[i]<=100000,1<=earnings[i]<=100000, dates中无重复元素。
对于任意i(0<=i<m),1<=start[i]<finish[i]<=100000, 1<=interest_rates[i]<=100。

Input
第一行为T (T<=200),表示输入数据组数。
每组数据格式如下:
第一行是n m
之后连续n行,每行为两个以空格分隔的整数,依次为date和earning
之后连续m行,每行为三个以空格分隔的整数,依次为start, finish和interest_rate
Output
对第i组数据,i从1开始计,输出
Case #i:
收益数值,保留小数点后两位,四舍五入。
Sample Input
2 1 2 1 10000 1 100 5 50 200 10 2 2 1 10000 5 20000 1 5 6 5 9 7
Sample Output
Case #1: 1000.00 Case #2: 2700.00
Source
2014年百度之星程序设计大赛 - 初赛(第二轮)
题目分析:
这里我们忽略利率底下的100,将其放在最后计算(因为所有的利益都要除以100,索性放到最后)。
这样,题目可以理解为, 给你n份钱,每份钱有一个价值val[i],每份钱所给的时间之后有x个区间,每个区间有一个价值w[i],选择互不相交的区间,这份钱能带来收益即为   val[i] *   sum(w[j])(其中所有的j互不相交)。  
所有钱带来的收益即为:sum(val[i] * sum(w[j]))(其中所有的j互不相交)。
那么怎么样才能使得收益达到最大??
设dp[i]为从第i个时间点开始往后选择的所有不想交的区间的价值总和的最大值,我们假设第i个时间点之后的dp[j]已经得到,那么dp[i] = max(dp[j])+ w[i];
则最大利益即 ans = sum(val[i] * dp[i]) / 100.0;(不要忘了将利率底下的100除掉)
这里我们用链式前向星存储属于以每个时间点为起点的每个区间的终点和价值。(并小小的加一个输入优化玩耍一下~)
代码如下:

#include <stdio.h>
#include <string.h>
#include <algorithm>
#define max(a, b) ((a) > (b) ? (a) : (b))
using namespace std;
const int O = 100005;
typedef struct E{int v, n, e;
}E;
E edge[O];
int Adj[O], l;
int val[O], dp[O];
int t, n, m, cas;
int d, e, s, f;
void addedge(int u, int v, int e){edge[l].v = v; edge[l].e = e; edge[l].n = Adj[u]; Adj[u] = l++;
}
int read(){char ch = ' ';int x = 0;while(ch < '0' || ch > '9') ch = getchar();while(ch >= '0' && ch <= '9'){x = x * 10 + ch - '0';ch = getchar();}return x;
}
void work(){memset(val, 0, sizeof(val));memset(Adj, -1, sizeof(Adj));l = 0;n = read(); m = read();while(n--){d = read(); e = read();val[d] += e;}while(m--){s = read(); f = read(); e = read();addedge(s, f, e);}dp[100001] = 0;double ans = 0;for(int i = 100000; i; --i){dp[i] = dp[i + 1];for(int j = Adj[i]; ~j; j = edge[j].n){dp[i] = max(dp[i], dp[edge[j].v] + edge[j].e);}ans += dp[i] * val[i];}printf("%.2f\n", ans / 100);
}
int main(){for(t = read(), cas = 1; cas <= t; ++cas){printf("Case #%d:\n", cas);work();}return 0;
}

HDU 4833

转载于:https://www.cnblogs.com/ac-luna/p/3752936.html

HDU 4833 Best Financing DP相关推荐

  1. HDU 4833 Best Financing 一脸费用流的dp

    原题:http://acm.hdu.edu.cn/showproblem.php?pid=4833 题意:中文题不解释... 解题思路: 首先以interest_rates为费用建图跑费用流是比较容易 ...

  2. 【HDU】 4833 Best Financing DP

    Best Financing Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  3. HDU 2196 Computer 树形DP经典题

    链接:http://acm.hdu.edu.cn/showproblem.php? pid=2196 题意:每一个电脑都用线连接到了还有一台电脑,连接用的线有一定的长度,最后把全部电脑连成了一棵树,问 ...

  4. HDU 2084 数塔 DP

    http://acm.hdu.edu.cn/showproblem.php?pid=2084 题目: 在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 有如下所示的数塔,要求从顶层走 ...

  5. HDU 1712 裸分组dp

    http://acm.hdu.edu.cn/showproblem.php?pid=1712 N门课M天复习,第i门课花费j天获得的效益是dp[i][j] 求最大效益 分组背包,同一门课不能选两次 三 ...

  6. HDU 4628 Pieces(DP + 状态压缩)

    Pieces 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4628 题目大意:给定一个字符串s,如果子序列中有回文,可以一步删除掉它,求把整个序列删除 ...

  7. hdu 4640(状压dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4640 思路:f[i][j]表示一个人状态i下走到j的最小花费,dp[i][j]表示i个人在状态j下的最 ...

  8. hdu 5569(二维dp,水题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5569 解题思路:dp[i][j]表示到达(i,j)位置时的最小值.由于目标式的特点,我们一次需要走两格 ...

  9. hdu 5067(状态压缩dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5067 解题思路:这道题开始想复杂了,想用bfs去求出最短距离,其实没必要,因为题目中没有阻碍关系,所以 ...

最新文章

  1. LinkedList模拟队列和堆栈
  2. elasticsearch+kibana
  3. 代理模式之Java动态代理
  4. [MapReduce] Google三驾马车:GFS、MapReduce和Bigtable
  5. java jespa_Jespa实际运用的一点心得
  6. 目前市场上的电脑一体机从计算机种类,一体机电脑与普通电脑的区别
  7. python中scrapy是什么_python中Scrapy数据流是什么
  8. 时间记录html,jquery水平、垂直时间线记录jQuery Timelinr
  9. 大数据时代的全能日志分析专家--Splunk安装与实践
  10. 网站建设-部署与发布
  11. 推荐系统在房产领域的实践
  12. ISO12233:2014 eSFR分辨率测试卡使用方法
  13. 如何保护眼睛,可采用语音方式获取外界知识,并积极锻炼身体做到劳逸结合。
  14. Mac:VSCode 批量替换快捷键
  15. 2020-11-7YTUOJ3545: 输出最长单词
  16. Maurice Wilkes
  17. java+js实现展示本地文件夹下的所有图片demo
  18. input中blur失去焦点事件与点击事件冲突的解决方法(vue)
  19. 【DP】2018国庆三校联考D3T1
  20. 区块链3.0 ada Cardano卡尔达诺如何获得一致好评?

热门文章

  1. 高考录取系统的模拟(1)——成绩的模拟生成程序
  2. c语言字母杨辉三角,用C语言编写杨辉三角(示例代码)
  3. manjaro 开机启动项_Re:从零开始的Manjaro配置
  4. 虚拟机桥接模式怎么都连不上网(桥接模式下不能连校园网)
  5. 百度实习两个月小结~
  6. Solar-PuTTY修改背景、字体颜色和字体大小
  7. Cocos Creator发布微信小游戏包内体积过大问题
  8. 云计算服务IaaS, PaaS和SaaS简介
  9. 2020年学oracle怎么样,2020年了学c++好不好?如何学?
  10. 淘宝UA算法中的核心函数