HDU1058
2015-11-20 17:05
253 查看
一道DP题,按照一个法则来生成一系列数,初始数是1.任意的第i个数可以看成是在i以前的数*2,*3,*5,或*7得到的,因为是按照从小到大的顺序生成的,于是DP[i]=min{2*DP[p1],3*DP[p2],5*DP[p3],7*DP[p4]};p1,p2,p3,p4分别表示用*2,*3,*4,*5方法生成新数的每列原数的最后一个数的下标。比如,假设集合A={a1,a2,a3..ak}表示由*2方法生成新数的原数集合,则当前下p1=k,当下一次用法则*2生成一个新数为2*ak,则更新集合A={a1,a2...ak,ak+1}此时更新p1=k+1;并且集合A一定是原数列Dp[i]的一个连续子列,即为a1=DP[1],a2=Dp[2]...ak=DP[k].所以只需要用指针记住集合A中最后一项位置即可。对于四中不同法则,每次需要取他们中生成数的最小者即可,并将此法则中的指针后移动一位来等待下一个数的生成。
#include<iostream>
using namespace std;
void HumerNumber();
void Format(int n);
int DP[5843];
int Min(int a, int b, int c, int d);
int main(){
int n;
HumerNumber();
while (cin >> n&&n){
Format(n);
cout <<DP
<<"."<< endl;
}
return 0;
}
void Format(int n){
if (n%100!=11&&n % 10 == 1)
cout << "The "<<n<<"st humble number is ";
else if (n%100!=12&&n%10==2)
cout << "The " << n << "nd humble number is ";
else if (n%100!=13&&n%10==3)
cout << "The " << n << "rd humble number is ";
else
cout << "The " << n << "th humble number is ";
}
int Min(int a, int b, int c, int d){
int min = a;
if (b < min)
min = b;
if (c < min)
min = c;
if (d < min)
min = d;
return min;
}
void HumerNumber(){
int p1, p2, p3, p4,i;
DP[1] = 1;
p1 = p2 = p3 = p4=1;
for (i = 2; i <= 5842; i++){
DP[i] = Min(2 * DP[p1], 3 * DP[p2], 5 * DP[p3], 7 * DP[p4]);
if (DP[i] == 2 * DP[p1])
p1++;
if (DP[i] == 3 * DP[p2])
p2++;
if (DP[i] == 5 * DP[p3])
p3++;
if (DP[i] == 7 * DP[p4])
p4++;
}
}
#include<iostream>
using namespace std;
void HumerNumber();
void Format(int n);
int DP[5843];
int Min(int a, int b, int c, int d);
int main(){
int n;
HumerNumber();
while (cin >> n&&n){
Format(n);
cout <<DP
<<"."<< endl;
}
return 0;
}
void Format(int n){
if (n%100!=11&&n % 10 == 1)
cout << "The "<<n<<"st humble number is ";
else if (n%100!=12&&n%10==2)
cout << "The " << n << "nd humble number is ";
else if (n%100!=13&&n%10==3)
cout << "The " << n << "rd humble number is ";
else
cout << "The " << n << "th humble number is ";
}
int Min(int a, int b, int c, int d){
int min = a;
if (b < min)
min = b;
if (c < min)
min = c;
if (d < min)
min = d;
return min;
}
void HumerNumber(){
int p1, p2, p3, p4,i;
DP[1] = 1;
p1 = p2 = p3 = p4=1;
for (i = 2; i <= 5842; i++){
DP[i] = Min(2 * DP[p1], 3 * DP[p2], 5 * DP[p3], 7 * DP[p4]);
if (DP[i] == 2 * DP[p1])
p1++;
if (DP[i] == 3 * DP[p2])
p2++;
if (DP[i] == 5 * DP[p3])
p3++;
if (DP[i] == 7 * DP[p4])
p4++;
}
}
相关文章推荐
- 让Windows Server 2008 + IIS 7+ ASP.NET 支持10万并发请求
- 【转】Jmeter使用之常用函数介绍
- 掌握sudo的使用
- PHP 时间和日期
- OS X系统下Eclipse Open Declaration快捷键的回退键
- Win10 Mobile版微软照片更新到1118:增加新的视频修剪功能
- 小P寻宝记——粗心的基友
- springMVC工作原理(转)
- web.xml文件元素描述
- 洗牌算法
- java.lang.Thread.State类详解
- 理解SQL【转http://blog.jobbole.com/55086/】
- 【转】JMeter使用指南
- lintcode 中等题 :Maximum Product Subarray 最大连续乘积子序列
- WebLogic11g-集群相关概念
- github key
- win10 uwp 绑定多数据
- 基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)到底有什么区别。
- 创建rabbitmq:virtual host、exchange、queue
- WebLogic11g-集群相关概念