查了好多资料,发现还是不全,干脆自己整理吧,至少保证在我的做法正确的,以免误导读者,也是给自己做个记录吧!
目题接链地址http://acm.hdu.edu.cn/showproblem.php?pid=1058
如果一个数是Humble Number,那么它的2倍,3倍,5倍,7倍仍然是Humble Number
定义F[i]为第i个Humble Number
F[n]
定义F[i]为第i个Humble Number
F[n]=min(2*f[i],3*f[j],5*f[k],7*f[L]), i,j,k,L在被选择后互相挪动
(通过此题懂得到数组有序性特)
/*
这几天测验温习啊,,但是还是要持坚做一道dp的题在睡觉啊,这个还是比较简单的dp题了吧。直接上代码了。
*/
#include <cstdio> const int maxn=5843; int a[maxn],num; void init() { //printf("init\n"); int i,k,l,m,n,x[4],minx; m=n=k=l=1; a[0]=1; for(i=1;i<maxn;i++) { x[0]=a[m-1]*2; x[1]=a[n-1]*3; x[2]=a[k-1]*5; x[3]=a[l-1]*7; minx=x[0]; if(x[1]<minx)minx=x[1]; if(x[2]<minx)minx=x[2]; if(x[3]<minx)minx=x[3]; a[i]=minx; //printf("a[%d]=%d\n",i,a[i]); if(minx==x[0])m++; if(minx==x[1])n++; if(minx==x[2])k++; if(minx==x[3])l++; } } int main() { init(); while(~scanf("%d",&num),num) { if(num % 10 == 1 && num % 100 != 11) printf("The %dst humble number is %d.\n",num,a[num-1]); else if(num % 10 == 2 && num % 100 != 12) printf("The %dnd humble number is %d.\n",num,a[num-1]); else if(num % 10 == 3 && num % 100 != 13) printf("The %drd humble number is %d.\n",num,a[num-1]); else printf("The %dth humble number is %d.\n",num,a[num-1]); } }
文章结束给大家分享下程序员的一些笑话语录: 警告
有一个小伙子在一个办公大楼的门口抽着烟,一个妇女路过他身边,并对他 说, “你知道不知道这个东西会危害你的健康?我是说, 你有没有注意到香烟 盒上的那个警告(Warning)?”
小伙子说,“没事儿,我是一个程序员”。
那妇女说,“这又怎样?”
程序员说,“我们从来不关心 Warning,只关心 Error”