美元和马克(dp)
【問題描述】
今天6:00起床,我轉身發現枕頭邊有100美元。
出門的時候發現門口有家冰淇淋店,拉了很長的橫幅:“今天100美元和400馬克互換”
第二天的橫幅是:“今天100美元和300馬克互換”
第三天的橫幅是:“今天100美元和500馬克互換”
第四天的橫幅是:“今天100美元和300馬克互換”
第五天的橫幅是:“今天100美元和250馬克互換”
第五天的晚上,我靈光一閃,決定坐時光飛機回到第一天的上午6:00,準備發大財!
我是這么做的:
Day 1 ... 用 100.0000 美元 換 400.0000 馬克
晚上我手里拿著400.0000馬克安心睡覺了
Day 2 ... 用 400.0000 馬克 換 133.3333 美元
晚上我手里拿著133.3333美元安心睡覺了
Day 3 ... 用 133.3333 美元 換 666.6666 馬克
晚上我手里拿著666.6666馬克安心睡覺了
Day 4 ... 我手里拿著666.6666 馬克 不換美元,因為我知道明天換更好呀
晚上我手里拿著666.6666馬克安心睡覺了
Day 5 ... 用 666.6666 馬克 換 266.6666 美元
晚上我手里拿著266.6666美元偷笑,我賺了166.6666美元。厲害吧?你有時光機嗎?
第六天全世界都不使用馬克了,所以最后一天留在手里的必須是美元!
【輸入文件】
第一行是一個自然數N,1≤N≤100,表示天數。
接下來的N行中每行是一個自然數a[i],1≤a[i]≤1000。
表示預先知道的第i天100美元 和 A馬克 能互換。
?
【輸出文件】
一行,即最后一天晚上手里的美元數目(保留兩位小數)。
解題思路:
dp1[i]代表前i天可以兌換出的最多美元,dp2[i]代表前i天可以兌換出的最多馬克,可以很容易得出轉移方程,
就是將前i-1天的另一種貨幣用當天的兌換比例轉換過來與前i-1天同種貨幣比較就可以了。
1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #include<iomanip> 5 #include<stdio.h> 6 #include<math.h> 7 #include<cstdlib> 8 #include<set> 9 #include<map> 10 #include<stack> 11 #include<queue> 12 #include<vector> 13 #include<set> 14 #define ll long long int 15 #define INF 0x7fffffff 16 #define mod 1000000007 17 #define me(a,b) memset(a,b,sizeof(a)) 18 #define PI acos(-1.0) 19 #define mian main 20 //size_t npos=-1; 21 //ios::sync_with_stdio(0),cin.tie(0); 22 using namespace std; 23 const int N=1e5+5; 24 25 int main() 26 { 27 double dp1[105],dp2[105],a[105]; 28 int n; 29 cin>>n; 30 for(int i=1;i<=n;i++) 31 cin>>a[i]; 32 dp1[0]=100; 33 dp2[0]=0; 34 for(int i=1;i<=n;i++){ 35 dp1[i]=max(dp2[i-1]/a[i]*(double)100,dp1[i-1]); 36 dp2[i]=max(dp1[i-1]/(double)100*a[i],dp2[i-1]); 37 } 38 cout<<setprecision(2)<<std::fixed<<dp1[n]<<endl; 39 }?
轉載于:https://www.cnblogs.com/DarkFireMater/p/9017072.html
總結
- 上一篇: 使用 Apache Atlas 进行数据
- 下一篇: Java 在 CMD 环境下编译