洛谷 P1968 美元汇率
生活随笔
收集整理的這篇文章主要介紹了
洛谷 P1968 美元汇率
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
傳送門
我在下面哦~~
I'm here
思路
這是一道比較簡單的DP題
美元可由馬克轉(zhuǎn)化得到,馬克可由美元轉(zhuǎn)化得到,最后要求最大的美元值
我們可以用f數(shù)組來記錄最大能達(dá)到多少馬克和多少美元。
定義一個(gè)\(f[N][3]\)的數(shù)組,第一維表示到達(dá)了第i天
\(f[i][1]\)表示到第i天能得到的最大美元值
\(f[i][2]\)表示到第i天能得到的最大馬克值
每天有兩種選擇的方式:
這樣就可以得出狀態(tài)轉(zhuǎn)移方程
\[f[i][1]=max(f[i-1][1],f[i-1][2]/w[i]*100.000)\]
\[f[i][2]=max(f[i-1][2],f[i-1][1]*w[i]/100.000)\]
(100.000是為了保證精度)
代碼
#include<bits/stdc++.h> #define N 110 using namespace std;double f[N][3],w[N]; int n;int main(){scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%lf",&w[i]);}f[1][1]=100;f[1][2]=w[1];for(int i=2;i<=n;i++){f[i][1]=max(f[i-1][1],f[i-1][2]/w[i]*100.000);f[i][2]=max(f[i-1][2],f[i-1][1]*w[i]/100.000);}printf("%.2lf",max(f[n][1],f[n][2]/w[n]*100.000));return 0; }優(yōu)化
我們可以發(fā)現(xiàn),第一維沒有什么用,所以我在上面的解釋也不能明確的解釋出它的作用,因此我們可以把第一維刪除,只使用2個(gè)值,狀態(tài)轉(zhuǎn)移方程如下
\[ f[1]=max(f[1],f[2]/w[i]*100.000)\]
\[f[2]=max(f[2],f[1]*w[i]/100.000)\]
#include<bits/stdc++.h> #define N 110 using namespace std;double f[3],w[N]; int n;int main(){scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%lf",&w[i]);}f[1]=100;for(int i=1;i<=n;i++){double x=f[1];//如果下面使用f[1],有可能f[1]的值早已改變,所以定義一個(gè)x,保證在使用的時(shí)候x的值沒有改變f[1]=max(f[1],f[2]/w[i]*100.000);f[2]=max(f[2],x*w[i]/100.000);}printf("%.2lf",f[1]);return 0; }轉(zhuǎn)載于:https://www.cnblogs.com/Snowindira/p/10836536.html
總結(jié)
以上是生活随笔為你收集整理的洛谷 P1968 美元汇率的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: leetcode 134. 加油站(Ga
- 下一篇: break、continue、retur