poj 1958 Strange Towers of Hanoi (dp)

做的第一个题目给算法的题。

过程说的很明了,先把n-k个用四个柱子的方法移动到B,再把k个用三个柱子的方法移动到D,最后把n-k个用四个柱子的方法移动到D。n-k个共移动了两次,三个柱子移动的最少步数我们知道为2^n-1,总的移动步数即为f[i-j]*2+t[j],得转移方程f[i] = Min(f[i], f[i-j]*2+t[j])。

因为比较有信心,直接用大号交的,没用majia,一交就傻眼了,竟然RE!好吧,真活该,数组开那么小干嘛,又不要钱...

代码:

#include<iostream>
#define Min(a, b)   a>b?b:a
using namespace std;

int t[13], f[13];
int main(){
    int i, j ;
    for(i=0; i<=12; i++)
        t[i] = (1 << i) - 1 ;
    for(i=1; i<=12; i++){
        f[i] = 100 ;
        for(j=1; j<=i; j++)
            f[i] = Min(f[i], f[i-j]*2+t[j]) ;
        cout << f[i] << endl ;
    }
    return 0 ;

} 

原文地址:https://www.cnblogs.com/xiaolongchase/p/2330664.html