HDU 1058 Humble Numbers(dp)
2015-08-17 11:26
453 查看
题目链接http://acm.hdu.edu.cn/showproblem.php?pid=1058
很巧妙的一个递推,因为只有2,3,5,7构成,那么后面的数一定是2,3,5,7的倍数,所以可以直接枚举那个最小,用四个变量来维护2,3,5,7分别算到几了。
dp【i】 = min(2 * dp[p2], 3 * dp[p3], 5 * dp[p5], 7 * dp[p7]);
View Code
很巧妙的一个递推,因为只有2,3,5,7构成,那么后面的数一定是2,3,5,7的倍数,所以可以直接枚举那个最小,用四个变量来维护2,3,5,7分别算到几了。
dp【i】 = min(2 * dp[p2], 3 * dp[p3], 5 * dp[p5], 7 * dp[p7]);
/************************************************************************* > File Name: 3.cpp > Author: Howe_Young > Mail: 1013410795@qq.com > Created Time: 2015年08月17日 星期一 11时28分41秒 ************************************************************************/ #include <cstdio> #include <iostream> #include <cstring> #include <cmath> #include <cstdlib> #include <algorithm> #define min3(a, b, c) min(a, min(b, c)) using namespace std; typedef long long ll; const int maxn = 10000; ll d[maxn]; ll dp(ll a, ll b, ll c, ll n) { d[0] = 1; int p1 = 0, p2 = 0, p3 = 0; for (int i = 1; i <= n; i++) { d[i] = min3(a * d[p1], b * d[p2], c * d[p3]); if (d[i] == a * d[p1]) p1++; if (d[i] == b * d[p2]) p2++; if (d[i] == c * d[p3]) p3++; } return d ; } int main() { ll p1, p2, p3, i; while (~scanf("%I64d %I64d %I64d %I64d", &p1, &p2, &p3, &i)) { printf("%I64d\n", dp(p1, p2, p3, i)); } return 0; }
View Code
相关文章推荐
- Fatal signal 11问题的解决方法
- [unity3d程序] 纹理扩散
- Linux下的五种I/O模型
- 爸爸去哪儿4对父子在圆桌上共有多少种坐法
- GLES1.x改动到GLES2.x要注意的点
- 问题:C#打开一个文本文档往里面写数据,没有就新建文档 ;结果:c#FileStream文件读写(转)
- 分布式缓存
- 不是Win10.1 微软正准备10月Win10 RTM预览版TH2更新
- 浅析Java数组声明、创建、初始化
- 视频码率,帧率和分辨率的联系与区别
- javascript object 相等判断逻辑
- apktool工具下载地址
- Python开发入门与实战17-新浪云部署
- 素数专题
- npm如何升级自身
- web架构提纲
- POJ 1141-Brackets Sequence(区间dp括号匹配打印路径)
- c++ windows程序崩溃生成转储dump
- 拍照、拍照裁剪
- 暑假-最短路(Bellman-ford、spfa)-F - Wormholes