HDU 1058 Humble Number DP

好好做专题系列= =

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[N] = {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[n]);
	}
	return 0;
}

所以,这题技巧性大于动态规划的思想= =

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值