您的位置:首页 > 其它

HDU 1058 Humble Number DP

2013-05-19 14:26 323 查看
好好做专题系列= =

DP第一题

【题意】因子只有{2、3、5、7}中一个或多个的数称为Humble Number,从小到大将它们排成数列,求第n个Humble Number。

这是前20个Humble Number {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 24, 25, 27}

【分析】因为因子只有2、3、5、7,即num = 2^a * 3^b * 5^c * 7^d

所以后面的每个数都等于前面某个已算出的乘以2、3、5或7。

还不明白?



于是可用一个比较巧妙的方法递推打表(非原创= =)

#include <iostream>
using namespace std;

#define N 6000
int ans
= {0,1};
int a[] = {1, 1, 1, 1};

int Min(int b, int c, int d, int e)
{
if(c<b) b = c;
if(d<b) b = d;
if(e<b) b = e;
return b;
}

int main()
{
int n;
//求Humble数,每循环一次求出一个
//a[0]~a[3]保存的分别是2、3、5、7乘到哪一个数
for(int i=2; i<=5842; i++)
{
int b = ans[a[0]]*2;
int c = ans[a[1]]*3;
int d = ans[a[2]]*5;
int e = ans[a[3]]*7;
ans[i] = Min(b, c, d, e);//选最小的
if(ans[i] == b)
a[0]++;
if(ans[i] == c)
a[1]++;
if(ans[i] == d)
a[2]++;
if(ans[i] == e)
a[3]++;
}

while(scanf("%d",&n),n)
{
if(n==0)
break;
if(n%100==11 || n%100==12 || n%100==13)
printf("The %dth", n);
else if(n%10==1)
printf("The %dst",n);
else if(n%10==2)
printf("The %dnd",n);
else if(n%10==3)
printf("The %drd",n);
else
printf("The %dth",n);
printf(" humble number is %d.\n",ans
);
}
return 0;
}


所以,这题技巧性大于动态规划的思想= =
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: