POJ丑数DP题汇总2591 1338 2247 2545

2591两个丑数

1338三个丑数

2247四个丑数

2545任意三个丑数

这几题的意思都差不多,排出一个序列,其中每个数的因子都只含q[0],q[1],q[2]这三个质数或其它,然后求出给定的第n个丑数

贴一份2545的代码

#include<functional>
#include<algorithm>
#include<iostream>
#include<fstream>
#include<sstream>
#include<iomanip>
#include<numeric>
#include<cstring>
#include<climits>
#include<cassert>
#include<cstdio>
#include<string>
#include<vector>
#include<bitset>
#include<queue>
#include<stack>
#include<cmath>
#include<ctime>
#include<list>
#include<set>
#include<map>
using namespace std;
__int64 dp[2342432];
__int64 min(__int64 q,__int64 w,__int64 e)
{
	__int64 m;
	m=q<w?q:w;
	m=m<e?m:e;
	return m;
}
int main()
{
    __int64 w,e,r,t,q[3];
	while(scanf("%I64d %I64d %I64d %I64d",&q[0],&q[1],&q[2],&w)!=EOF)
	{
	    __int64 i,j;
	    __int64 b1=1,b2=1,b3=1;
	    dp[1]=1;
	    for(i=2;i<=w+1;i++)
	    {
		    dp[i]=min(dp[b1]*q[0],dp[b2]*q[1],dp[b3]*q[2]);//找到dp[i]的最小值
            if(dp[i]==dp[b1]*q[0])
			    b1++;
	        if(dp[i]==dp[b2]*q[1])
			    b2++;
	        if(dp[i]==dp[b3]*q[2])
			    b3++;//各个质数的个数增加
	    }
	    printf("%I64d\n",dp[w+1]);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值