poj1958 strange towers of hanoi

说是递推,其实也算是个DP吧。

就是4塔的汉诺塔问题。

考虑三塔:先从a挪n-1个到b,把最大的挪到c,然后再把n-1个从b挪到c,所以是

f[i] = 2 * f[i-1] + 1;

那么4塔类似:

先在4塔模式下挪j个到b,然后在三塔模式下挪n-j个到d,然后再在4塔模式下挪j个到d。

故状态转移方程:

d[i] = min(2 * d[j] + f[n-j]) ,其中1 <= j < n

初始条件:f[n]与d[1] = 1;

然后就没有然后了。

 #include <cstdio>
#include <algorithm>
using namespace std;
const int N = ,INF=0x7f7f7f7f;
int f[N],d[N];
int main()
{
f[]=d[]=;
f[]=d[]=;
for(int i=;i<=;i++) {
f[i]=*f[i-]+;
}
for(int i=;i<=;i++)
{
int temp=INF;
for(int j=;j<i;j++)
temp=min(temp,*d[j]+f[i-j]);
d[i]=temp;
}
for(int i=;i<=;i++)
printf("%d\n",d[i]); return ;
}

AC代码

上一篇:jquery 判断当前上传文件大小限制上传格式 搭配thinkphp实现上传即预览(模拟异步上传)


下一篇:CentOS 6.5 中安装 Mysql 5.6,并远程连接Mysql