hduOJ 1058Humber Number 简单DP

简单的动态规划。

找到状态转移方程,禁止暴力遍历的方式确定p2、p3、p5、p7的选择。

在纸上画一画,方便理解。

下面这个是用List集合实现的,下面还有一个用数组实现的。用时1600ms,同样的代码用c++实现才100+ms 这效率差距真是一个数量级了...-_-#

package hudOJ;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;

public class Main1058
{
    public static void main(String[] args) throws IOException
    {
        int cnt = 0;
        ArrayList<Integer> ans = new ArrayList<>();
        int p2=0, p3=0, p5=0, p7=0;
        ans.add(1);
        while (ans.get(cnt)<2000000000)
        {
            ans.add(Math.min(Math.min(ans.get(p2)*2, ans.get(p3)*3), Math.min(ans.get(p5)*5, ans.get(p7)*7)));
            ++cnt;
            if(ans.get(p2)*2==ans.get(cnt))
                p2++;
            if(ans.get(p3)*3==ans.get(cnt))
                p3++;
            if(ans.get(p5)*5==ans.get(cnt))
                p5++;
            if(ans.get(p7)*7==ans.get(cnt))
                p7++;
//            System.out.println(p2+" "+p3+" "+p5+" "+p7);
        }

        BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
        while(true)
        {
            int key = Integer.parseInt(stdin.readLine());
            if (key==0) break;
            if (key%10==1 && key%100!=11) System.out.printf("The %dst humble number is %d.", key, ans.get(key-1));
            else if (key%10==2 && key%100!=12) System.out.printf("The %dnd humble number is %d.", key, ans.get(key-1));
            else if (key%10==3 && key%100!=13) System.out.printf("The %drd humble number is %d.", key, ans.get(key-1));
            else System.out.printf("The %dth humble number is %d.", key, ans.get(key-1));
            System.out.println();
        }
    }
}
/*

1
2
3
4
11
12
13
21
22
23
100
1000
5842
0


*/


大数组实现


package hudOJ;

import java.util.Scanner;


public class Main1058array
{
    public static void main(String[] args)
    {
        int cnt = 0;
        int[] ans = new int[5888];
        int p2=0, p3=0, p5=0, p7=0;
        ans[0] = 1;
        while (ans[cnt]<2000000000)
        {
            ans[++cnt] = Math.min(Math.min(ans[p2]*2, ans[p3]*3), Math.min(ans[p5]*5, ans[p7]*7));
            if(ans[p2]*2==ans[cnt])
                p2++;
            if(ans[p3]*3==ans[cnt])
                p3++;
            if(ans[p5]*5==ans[cnt])
                p5++;
            if(ans[p7]*7==ans[cnt])
                p7++;
//            System.out.println(p2+" "+p3+" "+p5+" "+p7);
        }

        Scanner stdin = new Scanner(System.in);
        while(stdin.hasNext())
        {
            int key = stdin.nextInt();
            if (key==0) break;
            if (key%10==1 && key%100!=11) System.out.printf("The %dst humble number is %d.", key, ans[key-1]);
            else if (key%10==2 && key%100!=12) System.out.printf("The %dnd humble number is %d.", key, ans[key-1]);
            else if (key%10==3 && key%100!=13) System.out.printf("The %drd humble number is %d.", key, ans[key-1]);
            else System.out.printf("The %dth humble number is %d.", key, ans[key-1]);
            System.out.println();
        }
    }
}
/*

1
2
3
4
11
12
13
21
22
23
100
1000
5842
0


*/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值