动态规划—Problem D

动态规划—Problem D
题意
有一组数,它们的共同特征是它们的因数只含2,3,5,7,有5842个数,要求输入一个数输出对于位置的数是多少。
解题思路
分析题意,要做的事就是求出所有这些符合条件的数,然后输出就不难了。若一个数是Humble数,则它的2、3、5、7倍仍然是Humble数。设dp[i]为第i个Humble数,则dp[t] = min(2*dp[num2], 3*dp[num3], 5*dp[num5], 7*dp[num7]), num2、num3、num5、num7在不断更新。
感想
让人抓狂的题目,比较烦。提交前几次时提示超时,然后全部改成了c语言并且减少了for循环,可是还是有问题,继续改改改,呵呵。这样的DP,我服。
AC代码

#include
#define NUM 5842
int Min(int a, int b, int c, int d)
{
    int Min1 = a < b ? a : b;
    int Min2 = c < d ? c : d;
    return Min1 < Min2 ? Min1 : Min2;
}
int main()
{
    int dp[NUM];
    int t,num2,num3,num5,num7;
    dp[1] = 1;
    num2 = num3 = num5 = num7 = 1;
    int m = 1;
    while(m <= 5842)
    {
        int temp = Min(2*dp[num2], 3*dp[num3], 5*dp[num5], 7*dp[num7]);
        dp[++m] = temp;
        if(temp == 2*dp[num2]) num2++;
        if(temp == 3*dp[num3]) num3++;
        if(temp == 5*dp[num5]) num5++;
        if(temp == 7*dp[num7]) num7++;
    }
    while( scanf("%d",&t), t)
    {
        if(t%10==1&&t%100!=11)
            printf("The %dst humble number is %d.\n",t,dp[t]);
        else if(t%10==2&&t%100!=12)
            printf("The %dnd humble number is %d.\n",t,dp[t]);
        else if(t%10==3&&t%100!=13)
            printf("The %drd humble number is %d.\n",t,dp[t]);
        else
            printf("The %dth humble number is %d.\n",t,dp[t]);
    }
    return 0;
}

你可能感兴趣的:(ACM,动态规划)