#include <stdio.h>
#define N 65
unsigned long long bit[N] = {1};
void cal_bit()
{
for(int i = 1; i < N; ++i)
bit[i] = bit[i-1] << 1;
}
unsigned long long dp[N] = {0,1};
void cal_dp()
{
cal_bit();
int i,j;
for(i = 2; i < N; ++i)
{
dp[i] = bit[i] - 1;
for(j = 1; j < i; ++j)
if( 2 * dp[i-j] + bit[j] - 1 < dp[i])
dp[i] = 2 * dp[i-j] + bit[j] - 1;
}
}
int main()
{
cal_dp();
int a;
while(scanf("%d",&a) != EOF)
printf("%lld\n",dp[a]);
return 0;
}
hdu 1207 汉诺塔2
最新推荐文章于 2019-06-04 21:28:51 发布
这是一个C语言实现的汉诺塔问题解决方案,使用了动态规划和位运算来求解。程序首先初始化位运算数组,然后计算动态规划数组,最后根据输入的盘数输出相应的移动次数。
972

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



