1. 程式人生 > >HDU 4833 Best Financing (DP)

HDU 4833 Best Financing (DP)

Best Financing

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


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

這個問題主要是進行轉化。

把投資點進行離散化,就可以看成從每個投資點出發可以最多賺多少錢。

每個投資點前面一段是屬於這個點的錢。

然後n^2的DP進行處理。

  1 /* ***********************************************
  2 Author        :kuangbin
  3 Created Time  :2014/5/25 16:13:32
  4 File Name     :E:\2014ACM\比賽\百度之星初賽2\C.cpp
  5 ************************************************ 
*/ 6 7 #include <stdio.h> 8 #include <string.h> 9 #include <iostream> 10 #include <algorithm> 11 #include <vector> 12 #include <queue> 13 #include <set> 14 #include <map> 15 #include <string> 16 #include <math.h> 17
#include <stdlib.h> 18 #include <time.h> 19 using namespace std; 20 struct NN1 21 { 22 int d,e; 23 void input() 24 { 25 scanf("%d%d",&d,&e); 26 } 27 }node1[3000]; 28 struct NN2 29 { 30 int start,finish; 31 int r; 32 void input() 33 { 34 scanf("%d%d%d",&start,&finish,&r); 35 } 36 }node2[3000]; 37 int a[5010]; 38 long long f[100010]; 39 long long f2[5010]; 40 int dp[5010]; 41 42 vector<int>vec[5010]; 43 vector<int>vec2[5010]; 44 int main() 45 { 46 //freopen("in.txt","r",stdin); 47 //freopen("out.txt","w",stdout); 48 int T; 49 int iCase = 0; 50 int n,m; 51 scanf("%d",&T); 52 while(T--) 53 { 54 iCase++; 55 printf("Case #%d:\n",iCase); 56 scanf("%d%d",&n,&m); 57 int cnt = 0; 58 memset(f,0,sizeof(f)); 59 for(int i = 0;i < n;i++) 60 { 61 node1[i].input(); 62 //a[cnt++] = node1[i].d; 63 f[node1[i].d] += node1[i].e; 64 } 65 for(int i = 1;i <= 100000;i++) 66 f[i] += f[i-1]; 67 for(int i = 0;i < m;i++) 68 { 69 node2[i].input(); 70 a[cnt++] = node2[i].start; 71 a[cnt++] = node2[i].finish; 72 } 73 sort(a,a+cnt); 74 cnt = unique(a,a+cnt) - a; 75 map<int,int>mp; 76 for(int i = 0;i < cnt;i++) 77 mp[a[i]] = i; 78 f2[0] = f[a[0]]; 79 for(int i = 1;i < cnt;i++) 80 f2[i] = f[a[i]] - f[a[i-1]]; 81 for(int i = 0;i < cnt;i++) 82 { 83 vec[i].clear(); 84 vec2[i].clear(); 85 } 86 for(int i = 0;i < m;i++) 87 { 88 node2[i].start = mp[node2[i].start]; 89 node2[i].finish = mp[node2[i].finish]; 90 vec[node2[i].start].push_back(node2[i].finish); 91 vec2[node2[i].start].push_back(node2[i].r); 92 } 93 memset(dp,0,sizeof(dp)); 94 for(int i = cnt-1;i >= 0;i--) 95 { 96 dp[i] = dp[i+1]; 97 int sz = vec[i].size(); 98 for(int j = 0;j < sz;j++) 99 dp[i] = max(dp[i],dp[vec[i][j]] + vec2[i][j]); 100 } 101 long long ans ; 102 //minCostMaxflow(cnt,cnt+1,ans); 103 ans = 0; 104 for(int i = 0;i < cnt;i++) 105 { 106 ans += (long long)dp[i]*f2[i]; 107 } 108 printf("%.2lf\n",(double)ans/100); 109 110 } 111 return 0; 112 }

相關推薦

HDU 4833 Best Financing DP

Best Financing Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 29    Accepted Submission(s): 3

hdu 1176 免費餡餅DP

身旁 post ++ scanf sim onos mon 一秒 strong 免費餡餅 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)

HDU 3613 Best Rewardexkmp

題意 首先給你一個長度為26的陣列,表示的是26個字母代表的權值,之後給你一串字串,之後給你一串字元,你需要將這個字元變成切成兩半,如果你切下來的部分是迴文串的話,那麼你將得到這部分的權值,如果他不是迴文串的話他的權值就是0,現在問你怎樣切使得切下來的兩個串的權值最大。 思路 首先將原串

HDU-1176-免費餡餅dp

都說天上不會掉餡餅,但有一天gameboy正走在回家的小徑上,忽然天上掉下大把大把的餡餅。說來gameboy的人品實在是太好了,這餡餅別處都不掉,就掉落在他身旁的10米範圍內。餡餅如果掉在了地上當然就不能吃了,所以gameboy馬上卸下身上的揹包去接。但由於小徑兩側都不能站人,所以他只能在小徑上接。

hdu 1087 Super Jumping!dp

思路:動態規劃的三個原則是:1.子問題重疊性2.無後效性3.子結構最優性 如果這題把dp[i]當成前i個數的最長上升子序列的話,那第i+1個數會影響前i個數的選擇,比如 5 6 1 2 3;第i+1個

hdu 2084 數塔 dp

很簡單的dp問題。 以下附上ac程式碼 #include<iostream> #include<cmath> #include<cstring> # define max(a,b) ((a)>(b)?(a):(b))//

HDU 6170 Two strings dp

Description Giving two strings and you should judge if they are matched. The first string co

2017多校訓練賽第九場 HDU 6170 Two Stringdp

Two strings Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 1723    Accepted Sub

hdu-1159 Common Subsequence dp中的lcs問題

contain asi dice spa ... con ive min iss Common Subsequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/O

HDU 5389 Zero Escapedp啊 多校

white pla bold name lan ems popu orm fin 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=5389 Problem Description Zero Esc

HDU 5890 Eighty sevenDP+bitset優化

using ostream brush i+1 eset ons bitset print sort 這個題的背包的思想還是很容易想到的,但是這個bitset優化還是有點神奇的呀。。 #include<bitset> #include<stdio.h

hdu-1176dp

== 同時 scanf ret pri 移動 blog OS div 解題思路:用dp做的,dp[i][j]表示在i時刻,j點的最大餡餅。a[i][j]表示在i這個時刻j點同時掉落的餡餅; 每個點除了0和10之外,都有三種狀態; 1、沒有移動,這樣值就為dp[i][j]=m

HDU 5550 - Game RoomsDP + 前綴和預處理

pro esp \n microsoft -s print ase game type 鏈接: http://acm.hdu.edu.cn/showproblem.php?pid=5550 題意: 一個大樓有n(2≤n≤4000)層,每層可以建一個乒乓球房或者一個遊泳房

數塔問題-hdu-2084dp

題目連結:http://acm.hdu.edu.cn/showproblem.php?pid=2084 思路:要求從頂到底的最大值,可以反過來考慮,從底部向上。 只有下面一行的最大值確定,這一行的最大值才能確定。 #include<iostream> #include<cstdi

HDU - 1176 免費餡餅dp 倒數塔 簡單題

題目連結 簡單的dp題; 題意:每分鐘能得到一個位置上的餅,問最終最多能得到多少; 把每分鐘的看成一層數塔,然後從最後一分鐘往下推; 每次比較往前走,不走,往後走三個位置;   #include <iostream> #include <cstdi

HDU 1176 免費餡餅 DP+數塔問題

題目連結:http://acm.hdu.edu.cn/showproblem.php?pid=1176 題目大意:在一個0到10的閉區間中,會不定期有餡餅掉落,主角一開始在5號位置,他每秒只能移動一個位置,比如第一秒主角在5號位置,第二秒主角只能在4,5,6號位置。輸入N組資料,問主角最大能

hdu--2084 數塔dp類題目

題目連結:http://acm.hdu.edu.cn/showproblem.php?pid=2084 題意:我最開始以為是搜尋,想從下往上推,結果明顯不行(方案太多了),暴力肯定也是行不通的,所以千思萬想應該從下往上推。 核心方程:a[i][j]=max(a[i][j]+a[i

HDU-1087-Super Jumping! Jumping! Jumping! dp

Nowadays, a kind of chess game called “Super Jumping! Jumping! Jumping!” is very popular in HDU. Maybe you are a good boy, and know little about this

HDU 2059 - 龜兔賽跑DP

龜兔賽跑 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 22515  &

HDU-1428-漫步校園 bfs與dfs與記憶化搜尋dp

原題連結: http://acm.hdu.edu.cn/showproblem.php?pid=1428 LL最近沉迷於AC不能自拔,每天寢室、機房兩點一線。由於長時間坐在電腦邊,缺乏運動。他決定充分利用每次從寢室到機房的時間,在校園裡散散步。整個HDU校園呈方形佈局,可劃分為n*n個小