一道经典的Dp(动态规划)题解法,供学习

qq_40172643 2019-07-30 07:00:21
1063:动态规划入门(一维一边推1:美元和马克) 时间限制: 1 Sec 内存限制: 128 MB 题目描述 【问题描述】 今天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马克 能互换。 【输出文件】 一行,即最后一天晚上手里的美元数目(保留两位小数)。 输入 输出 样例输入 5 400 300 500 300 250 样例输出 266.67 提示 感受隐形路径 题外话 断更良久。。。 虽然说都是简单题 刷水题是会长自信2333 六校联考考完,,,物理生物药丸,暑假没看qwq 1 2 3 4 可爱的题解 动态规划的基本题 mymax函数比较最大值 用double是因为数据处理中会有小数出现所以一律用double { d[i]=mymax(d[i-1],m[i-1]*100.0/a[i]); m[i]=mymax(m[i-1],d[i-1]*a[i]/100.0); } 这一步便是此代码的核心,d表示美元的最佳选择,m为马克的最佳选择,d[i]更新为不换mark继承上一天或者更换mark,或者换mark,下一天又会用到刚刚更新的数据一直到最后。 m同理。一直做到最后一题输出dn即可 其中一条隐藏的路径 为什么这样做的能正解呢 这便是动态规划适用的性质之一 无后效性与最优子结构性 通俗易懂的说法 无后效性:后面发生的事件对已发生过的没有影响 最优子结构性:最优解一定包含子问题的最优解 *在本题中新一天是否决定换并不会对过去造成影响 *最终的最优解都取决于前一天的最优解 *故可用动态规划算法(Dynamic Programming) 这是一个开端,相信大家已经都清楚啦>_ #include<iostream> #include<cstdio> #include<algorithm> using namespace std; double mymax(double x,double y){ return x>y?x:y; } int main(){ double a[110],d[110],m[110]; int n; scanf("%d",&n); scanf("%lf",&a[1]); d[1]=100.0;m[1]=a[1]; for (int i=2;i<=n;i++){ scanf("%lf",&a[i]); d[i]=mymax(d[i-1],m[i-1]*100.0/a[i]); m[i]=mymax(m[i-1],d[i-1]*a[i]/100.0); } printf("%0.2lf\n",d[n]); return 0; }
...全文
85 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
みしつかん 2019-07-30
  • 打赏
  • 举报
回复

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧