为什么不翻译成“热舞革命”呢, KONAMI名作啊。
多阶段决策问题
Dp( x, y, k ) 表示当左脚在 x 位置, 右脚在 y 位置, 从第 k 个舞步跳完为止的耗费最小体力,要么跳左脚,要么跳右脚,取最小即可
边界条件
Dp( x, y, k) = 0 if (k = m)
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#define INF (int)(1e9)
#define MAXN 8
using namespace std;
int dp[10][10][10010], a[10010], m;
int effort(int a, int b) {
if (a == b) return 1;
if (a == 0 || b == 0) return 2;
if (abs(a - b) == 1) return 3;
if (abs(a - b) == 2) return 4;
}
int solve(int x, int y, int k) {
if (k == m) return dp[x][y][k] = 0;
if (dp[x][y][k] != -1) return dp[x][y][k];
int res = min(solve(a[k],y,k+1) + effort(x,a[k]), solve(x,a[k],k+1) + effort(y,a[k]));
//cout << res << endl;
return dp[x][y][k] = res;
}
int main() {
#ifdef LOCAL
freopen("data.in", "r", stdin);
#endif // LOCAL
int n;
while (cin >> n) {
memset(dp, -1, sizeof(dp));
if (!n) break;
int p = 0;
a[p ++] = n;
while (cin >> n) {
if (n == 0) break;
a[p ++] = n;
}
m = p;
solve(0,0,0);
int res = INF;
cout << dp[0][0][0] << endl;
}
}