hdu1068【动态规划】

  一道经典的dp。因子中只含2,3,5,7的数字叫做humble number,求第n个丑数。任何新的丑数都是原来的丑数乘以2or3or5or7得来的,由此可以得到新的丑数的转移方程dp[i] = min(dp[a] * 2, dp[b] * 3, dp[c] * 5, dp[d] * 7),而abcd分别由四个变量维护。

 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 int ans[6000];
 5
 6 int getmin(int a, int b, int c, int d) {
 7     int e = a < b ? a : b;
 8     int f = c < d ? c : d;
 9     return e < f ? e : f;
10 }
11
12 void init() {
13     ans[1] = 1;
14     int a = 1, b = 1, c = 1, d = 1;
15     for(int i = 2; i <= 5842; i++) {
16         int res = getmin(ans[a] * 2, ans[b] * 3, ans[c] * 5, ans[d] * 7);
17         ans[i] = res;
18         if(ans[a] * 2 == res) a++;
19         if(ans[b] * 3 == res) b++;
20         if(ans[c] * 5 == res) c++;
21         if(ans[d] * 7 == res) d++;
22     }
23     return;
24 }
25
26 int main() {
27     init();
28     // cout << ans[1000] << endl;
29     // 450
30     int n;
31     while(scanf("%d", &n), n) {
32         printf("The %d", n);
33         if(n % 100 > 10 && n % 100 < 20) {
34             printf("th");
35             goto loop;
36         }
37         int res = n % 10;
38         if(res == 1) printf("st");
39         else if(res == 2) printf("nd");
40         else if(res == 3) printf("rd");
41         else printf("th");
42         loop: printf(" humble number is %d.\n", ans[n]);
43     }
44     return 0;
45 }
46
47 /*
48 1
49 2
50 3
51 4
52 11
53 12
54 13
55 21
56 22
57 23
58 100
59 1000
60 5842
61 0
62
63 The 1st humble number is 1.
64 The 2nd humble number is 2.
65 The 3rd humble number is 3.
66 The 4th humble number is 4.
67 The 11th humble number is 12.
68 The 12th humble number is 14.
69 The 13th humble number is 15.
70 The 21st humble number is 28.
71 The 22nd humble number is 30.
72 The 23rd humble number is 32.
73 The 100th humble number is 450.
74 The 1000th humble number is 385875.
75 The 5842nd humble number is 2000000000.
76 */ 
时间: 2024-10-16 23:41:25

hdu1068【动态规划】的相关文章

Leetcode 494 Target Sum 动态规划 背包+滚动数据

这是一道水题,作为没有货的水货楼主如是说. 题意:已知一个数组nums {a1,a2,a3,.....,an}(其中0<ai <=1000(1<=k<=n, n<=20))和一个数S c1a1c2a2c3a3......cnan = S, 其中ci(1<=i<=n)可以在加号和减号之中任选. 求有多少种{c1,c2,c3,...,cn}的排列能使上述等式成立. 例如: 输入:nums is [1, 1, 1, 1, 1], S is 3. 输出 : 5符合要求5种

活动选择的贪心算法与动态规划(未完成)

// greedy_algorithm.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include<queue> using namespace std; #define NofActivity 11 int c[NofActivity + 1][NofActivity + 1]; int reme[NofActivity + 1][NofActivity + 1]; //活动的

求不相邻金币相加和的最大值--动态规划1

求不相邻金币相加和的最大值. 输入n个金币的金币面值(正数自定义),求这些金币不相邻和的最大值. 动态规划问题1 设f(n)为第n个金币数的最大值,f(0)=0,f(1)=a[1],输入的数组从下标为1开始. f(n)=max{a[n]+f(n-2),f(n-1)}. 代码如下: import java.util.Scanner; public class Jin_bi_zui_da_zhi { public static void main(String[] args) { Scanner s

[动态规划] 黑客的攻击 Hacker&#39;s CrackDown Uva 11825

抽象为数学模型就是,  取尽可能多的互不相交的子集 ,  使得每一个子集都能覆盖全集 #include <algorithm> #include <cstring> #include <cstdio> using namespace std; int n; int P[1000],cover[1000],f[1000]; int main(){ scanf("%d", &n); for (int i = 0; i < n;i++) {

Beauty Of algorithms(七)动态规划 钢条分割 矩阵链乘 最长公共子序列 最优二叉树

1.动态规划                动态规划的方法与方法类似,英文"dynamic programming",这里的programming不是程序的意思,而是一种表格法.都是通过组合子问题的解来解决原问题,分治方法将划分为互不相交的子问题,递归的求解子问题,再将它们的解组合起来求出原问题的解.与之相反动态规划应用于子问题的重叠情况,即不同的子问题具有公共的子问题,子问题的求解是递归进行 的,将其划分为更小的子问题,动态规划,每个子问题只求解一次,将其保存在表格中,从而无需每次求

Hdoj 1176 免费馅饼 【动态规划】

免费馅饼 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 26110    Accepted Submission(s): 8905 Problem Description 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy的人品实在是太好了,这馅饼别处都不掉,就掉落在他身旁的1

Fibonacci斐波拉契数列----------动态规划DP

n==10 20 30 40 50 46 体验一下,感受一下,运行时间 #include <stdio.h>int fib(int n){ if (n<=1)     return 1; else            return fib(n-1)+fib(n-2); }int main( ){ int n; scanf("%d",&n); printf("%d\n" ,fib(n) );} 先 n==10 20 30 40 50 46

pat 1068 动态规划/Fina More Conis

1068. Find More Coins (30) Eva loves to collect coins from all over the universe, including some other planets like Mars. One day she visited a universal shopping mall which could accept all kinds of coins as payments. However, there was a special re

动态规划(4)——最长上升子序列(作业题NYOJ201)

作业题 描述 小白同学这学期有一门课程叫做<数值计算方法>,这是一门有效使用数字计算机求数学问题近似解的方法与过程,以及由相关理论构成的学科-- 今天他们的Teacher S,给他们出了一道作业题.Teacher S给了他们很多的点,让他们利用拉格朗日插值公式,计算出某严格单调函数的曲线.现在小白抄下了这些点,但是问题出现了,由于我们的小白同学上课时走了一下神,他多抄下来很多点,也就是说这些点整体连线不一定还是严格递增或递减的了.这可怎么处理呢.为此我们的小白同学制定了以下的取点规则: 1.取