題目描述 description
懷特先生是乙個大胖子。他很喜歡玩跳舞機(dance dance revolution, ddr),甚至希望有一天人家會腳踏「舞蹈家懷特先生」。可惜現在他的動作根本不能稱作是在跳舞,儘管每次他都十分投入的表演。這也難怪,有他這樣的體型,玩跳舞機是相當費勁的。因此,他希望寫乙個程式來安排舞步,讓他跳起來輕鬆一些,至少不要每次都汗流浹背。
ddr的主要內容是用腳來踩踏板。踏板有四個方向的箭頭,用1 (up)、2 (left)、3 (down)、4 (right)來代表,中間位置由0來代表。每首歌曲有乙個箭頭序列,遊戲者必須按照或這個序列一次用某乙隻腳踩相應的踏板。在任何時候,兩隻腳都不能在同一踏板上,但可以同時待在中心位置0。
每乙個時刻,它必須移動而且只能移動他的乙隻腳去踩相應的箭頭,而另乙隻腳不許移動。跳完一首曲子之後,懷特先生會計算他所消耗的體力。從中心移動到任何乙個箭頭耗費2單位體力,從任何乙個箭頭移動到相鄰箭頭耗費3單位體力,移動到相對的箭頭(1和3相對,2和4相對)耗費4單位體力,而留在原地再踩一下只需要1單位。懷特先生應該怎樣移動他的雙腳(即,對於每個箭頭,選乙隻腳去踩它),才能用最少的體力完成一首給定的舞曲呢?
例如,對於箭頭序列left (2), left (2), up (1), right (4),他應該分別用左、左、右、右腳去踩,總的體力耗費為2+1+2+3=8單位。
輸入描述 input description
第一行n,表示有n個時刻 1<=n<=10000
第二到n+1行,每行乙個數,表示需要踩得版
輸出描述 output description
乙個數,最小消耗體力
樣例輸入 sample input
21
1樣例輸出 sample output
3資料範圍及提示 data size & hint
n<=10000
題解:
dp
f[i][j][k]表示第i次跳時,先生的左腳在j,右腳在k,則轉移方程為
f[i][a[i]][k]=min
f[i][j][a[i]]=min
#include#include#include
using
namespace
std;
int n,ans,f[10002][5][5],a[10002
];int dis(int u,int
v)int
main()
for(int i=0;i<=4;i++)
for(int j=0;j<=4;j++)
if(i!=j)ans=min(ans,f[n][i][j]);
printf(
"%d\n
",ans);
return0;
}
CODEVS 3049 舞蹈家懷特先生
根據題目描述,只有一開始會站在0這個格仔上,以後不會向這個格仔移動 假設f i j k 為 當前時間i,兩隻腳分別在j,k兩個格仔上的最小體力花費 第i個時間的狀態為f i a i k 或者f i j a i 即有乙隻腳在指定格仔上,所以分兩種情況列舉 轉移方程 f i j a i min f i ...
3049 舞蹈家懷特先生
時間限制 1 s 空間限制 64000 kb 題目等級 gold 輸入描述 input description 第一行n,表示有n個時刻 1 n 10000 第二到n 1行,每行乙個數,表示需要踩得版 輸出描述 output description 乙個數,最小消耗體力 樣例輸入 sample in...
題 字首和 NKOJ 3049 三分陣列
nkoj 3049 三分陣列 時間限制 10000 ms 空間限制 65536 kb 問題描述 給出乙個有n 個整數的陣列a 1 a 2 a n 有多少種方法把陣列分成3 個連續的子串行,使得各子串行的元素之和相等。也就是說,有多少個下標對i,j 2 i j n 1 滿足 sum a 1 a i 1...