做的第一个题目给算法的题。
过程说的很明了,先把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 ;
#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 ;
}