丑数,好像在面试宝典上见过,不错的动态规划题
状态转移方程 :hum[i]=min(min(2*hum[index[0]],3*hum[index[1]]),min(5*hum[index[2]],7*hum[index[3]]));
因为此题的当前状态跟转移状态不具有直接联系,而是顺序由前面四个状态的移动来决定
#include<iostream>
#include<cstdio>
#define MAX 5843
using namespace std;
int min(int a,int b)
{
return a>b? b:a;
}
int main()
{
int n;
int hum[MAX];
hum[0]=1;
int index[4]={0,0,0,0};
for(int i=1; i<MAX; i++)
{
hum[i]=min(min(2*hum[index[0]],3*hum[index[1]]),min(5*hum[index[2]],7*hum[index[3]]));
if(hum[i]==2*hum[index[0]]) index[0]++;
if(hum[i]==3*hum[index[1]]) index[1]++;
if(hum[i]==5*hum[index[2]]) index[2]++;
if(hum[i]==7*hum[index[3]]) index[3]++;
}
while(cin>>n,n)
{
if(n%10==1&&n %100!=11)
printf("The %dst humble number is %d.\n",n,hum[n-1]);
else if(n%10==2&&n %100!=12)
printf("The %dnd humble number is %d.\n",n,hum[n-1]);
else if(n%10==3&&n %100!=13)
printf("The %drd humble number is %d.\n",n,hum[n-1]);
else
printf("The %dth humble number is %d.\n",n,hum[n-1]);
}
}
本文探讨了如何使用动态规划解决丑数问题,通过状态转移方程和优化算法实现高效求解,包括代码实现和详细解释。
1万+

被折叠的 条评论
为什么被折叠?



