您的位置:首页 > 其它

hdu 1058 Humble Numbers (dp)

2013-08-09 09:43 393 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1058

解题报告:纠结!看了两三天了,始终不知到如何找递推关系式,今天终于忍不住了,看了别人的解题报告才搞明白(自己还是很水啊!)

关系式 a
=min(2*a[c1],3*a[c2],5*a[c3],7*a[c4]);

然后从小到大一个一个的往上递推!(这方法也太牛了吧)

本以为是打表的题目,但是数据的大小绝对不会允许的,时间、空间复杂度都回超;

code:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stdlib.h>
using namespace std;

int m, a[6000];

int MIN( int a,int b,int c,int d )
{
if(a > b) a=b;
if(a > c) a=c;
if(a > d) a=d;
return a;
}

void Init()
{
a[1]=1;
int c1,c2,c3,c4,n;
n=c1=c2=c3=c4=1;
while( n<5842 )
{
a[++n]=MIN( 2*a[c1],3*a[c2],5*a[c3],7*a[c4]);
if( a
== 2*a[c1] ) c1++;
if( a
== 3*a[c2] ) c2++;
if( a
== 5*a[c3] ) c3++;
if( a
== 7*a[c4] ) c4++;
}
}

int main()
{
Init();
while(scanf("%d",&m)&&m)
{
if( m%10==1 && m%100!=11)
printf("The %dst humble number is %d.\n",m,a[m]);
else if( m%10==2 && m%100!=12)
printf("The %dnd humble number is %d.\n",m,a[m]);
else if( m%10==3 && m%100!=13)
printf("The %drd humble number is %d.\n",m,a[m]);
else
printf("The %dth humble number is %d.\n",m,a[m]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  动态规划 dp