(笔试题)风口的猪-中国牛市
題目:
風(fēng)口之下,豬都能飛。當(dāng)今中國(guó)股市牛市,真可謂“錯(cuò)過(guò)等七年”。 給你一個(gè)回顧歷史的機(jī)會(huì),已知一支股票連續(xù)n天的價(jià)格走勢(shì),以長(zhǎng)度為n的整數(shù)數(shù)組表示,數(shù)組中第i個(gè)元素(prices[i])代表該股票第i天的股價(jià)。 假設(shè)你一開(kāi)始沒(méi)有股票,但有至多兩次買(mǎi)入1股而后賣(mài)出1股的機(jī)會(huì),并且買(mǎi)入前一定要先保證手上沒(méi)有股票。若兩次交易機(jī)會(huì)都放棄,收益為0。 設(shè)計(jì)算法,計(jì)算你能獲得的最大收益。 輸入數(shù)值范圍:2<=n<=100,0<=prices[i]<=100
輸入例子:
3,8,5,1,7,8輸出例子:
12思路:
1、動(dòng)態(tài)規(guī)劃
i表示第i天,k表示第k次交易
- 狀態(tài)轉(zhuǎn)移方程:
- pmax = max{ f(j,k-1)+prices[i]-prices[j] } (0<=j<i)}
- f(i,k) = max{ f(i-1,k), pmax}
- 即f(i,k ) = max{? f(i-1,k) ,? max { f(j,k-1) + prices[i]-prices[j]? |? 0<=j<i } }
- f(i-1,k)表示第i天不交易
- max{ f(j,k-1)+prices[i]-prices[j] } (0<=j<i)}表示第i天賣(mài),而這次交易的買(mǎi)應(yīng)該來(lái)自第j天,f(j,k-1) +prices[i] - prices[j] ,0<=j<i ,取最大值。
- max{ f(j,k-1)+prices[i]-prices[j] } (0<=j<i)},這一步可以通過(guò)單調(diào)隊(duì)列來(lái)優(yōu)化,可以參考一下:http://www.cnblogs.com/ka200812/archive/2012/07/11/2585950.html,簡(jiǎn)單的來(lái)說(shuō),就是將方程中包含j的部分單獨(dú)拿出來(lái)處理,即max(f(j,k-1)-prices[j])
2、前綴、后綴數(shù)組
通過(guò)前綴數(shù)組A來(lái)計(jì)算0次或1次交易的最大收益;
通過(guò)后綴數(shù)組B來(lái)計(jì)算0次或1次交易的最大收益;
通過(guò)遍歷0-n,計(jì)算max(A[i]+B[i])即為最大收益;
代碼:
1、簡(jiǎn)單的動(dòng)態(tài)規(guī)劃
class Solution { public:/*** 計(jì)算你能獲得的最大收益* * @param prices Prices[i]即第i天的股價(jià)* @return 整型*/int kTransaction(vector<int> prices,int k){int n=prices.size();vector<vector<int> > dp(n,vector<int>(k+1,0));int mx;for(int i=1;i<n;i++){for(int t=1;t<=k;t++){mx=dp[i-1][t];for(int j=i-1;j>=0;j--)mx=max(mx,dp[j][t-1]+prices[i]-prices[j]);dp[i][t]=mx;}}return dp[n-1][k];}int calculateMax(vector<int> prices) {return kTransaction(prices,2);} };2、單調(diào)隊(duì)列優(yōu)化的動(dòng)態(tài)規(guī)劃
class Solution { public:/*** 計(jì)算你能獲得的最大收益* * @param prices Prices[i]即第i天的股價(jià)* @return 整型*/int kTransaction(vector<int> prices,int k){int n=prices.size();vector<vector<int> > dp(n,vector<int>(k+1,0));vector<int> pMax(k+1,0);int mx;for(int i=0;i<=k;i++)pMax[i]=-prices[0];for(int i=1;i<n;i++){pMax[0]=max(pMax[0],dp[i][0]-prices[0]);for(int t=1;t<=k;t++){mx=dp[i-1][t];mx=max(mx,pMax[t-1]+prices[i]);pMax[t-1]=max(pMax[t-1],dp[i][t-1]-prices[i]);dp[i][t]=mx;}}return dp[n-1][k];}int calculateMax(vector<int> prices) {return kTransaction(prices,2);} };3、前綴后綴數(shù)組
class Solution { public:/*** 計(jì)算你能獲得的最大收益* * @param prices Prices[i]即第i天的股價(jià)* @return 整型*/int calculateMax(vector<int> prices) {int n=prices.size();vector<int> leftMax(n);vector<int> rightMax(n);int lmin=prices[0];leftMax[0]=0;for(int i=0;i<n;i++){lmin=min(lmin,prices[i]);leftMax[i]=max(leftMax[i-1],prices[i]-lmin);}int rmax=prices[n-1];rightMax[n-1]=0;for(int i=n-2;i>=0;i--){rmax=max(rmax,prices[i]);rightMax[i]=max(rightMax[i+1],rmax-prices[i]);}int pmax=0;for(int i=0;i<n;i++)pmax=max(pmax,leftMax[i]+rightMax[i]);return pmax;} }; ?轉(zhuǎn)載于:https://www.cnblogs.com/AndyJee/p/4478159.html
總結(jié)
以上是生活随笔為你收集整理的(笔试题)风口的猪-中国牛市的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: macOS 上编译 Dynamips
- 下一篇: 常见主板故障的详解