有一個跳舞機。原點為0,有四個方向,上左下右,分別標成(1234),初始玩家兩只腳站在 0 位置,跳舞機會給出一串數字,玩家要按照順序踩下四個方向的數字。移動腳會消耗玩家的能量,從0位置移動到四個方向消耗2點能量,從一個方向移動到另一個相鄰的方向消耗3點能量,從一個方向移動到相反方向消耗4點能量,原點踩一下消耗1點能量。問你踩出這串數子最少要花多少能量。
根據能量消耗關系,我們可以發現當前兩只腳踩的方向才是重點。然而要記錄兩只腳的方向麼?其實不用,因為我們可以發現兩只腳的狀態是互不影響的,而且單跳到第i個數字的時候,有一只腳的位置是確定的。
然後在dp[n][*]裡面找個最小值。
#includeusing namespace std; const int INF = 999999999; int k; int a[100010]; int _read() { int tmp; for ( k=1; scanf(%d, &tmp) && tmp; ) {// cout << tmp << endl; a[k++] = tmp; } // a[k++] = tmp; return k; } int dp[100010][5]; int _get(int a, int b) { if (a == 0) return 2; if (a == b) return 1; if (abs(a-b) == 1 || abs(a-b) == 3) return 3; if (abs(a-b) == 2) return 4; } int main () {// cout << * << endl; for (; _read() != 1; ) {// cout << k << endl; for (int i=0; i<=k; i++) { fill(dp[i], dp[i]+5, INF); } dp[1][0] = _get(0, a[1]); for (int i=2; i