舞蹈家懷特先生(線型)

2022-03-02 21:50:11 字數 1695 閱讀 8375

難度等級:**

輸入描述 input description

第一行n,表示有n個時刻 1<=n<=10000

第二到n+1行,每行乙個數,表示需要踩得版

輸出描述 output description

乙個數,最小消耗體力

樣例輸入 sample input

樣例輸出 sample output

資料範圍及提示 data size & hint

n<=10000

f[i][l][r]表示踩了i步,第i步左腳踩在l,右腳踩在r的最小消耗體力

初始化:f極大值

特殊處理:第1步規定左腳踩,左腳踩到直到出現與第乙個不同的箭頭,換右腳踩第一步

狀態轉移:設第i步踩在x

f[i][l][r]=min(f[i-1][x][r]+move[l][x])

f[i][l][r]=min(f[i-1][l][r]+move[r][x])

第一次**,沒有預處理move陣列,**冗長,判斷移動消耗多少體力時老出錯

#include#include

#include

using

namespace

std;

int n,f[10001][5][5],y,ans=50000

;int work(int i,int l,int r,int self,int left,int right,int now_l,int now_r,int

p)int

main()

if(a)

continue

; }

for(int l=1;l<=4;l++)

for(int r=1;r<=4;r++)

for(int l=1;l<=4;l++)

for(int r=1;r<=4;r++)

}for(int i=0;i<=4;i++)

for(int j=0;j<=4;j++)

ans=min(ans,f[n][i][j]);

printf("%d

",ans);

}

第二次**,預處理move陣列,簡單方便

#include#include

#include

using

namespace

std;

int n,f[10001][5][5],y,ans=50000

;int move[5][5]=,,,,};

intmain()

if(a)

continue

; }

for(int l=1;l<=4;l++)

for(int r=1;r<=4;r++)

for(int l=1;l<=4;l++)

for(int r=1;r<=4;r++)

}for(int i=0;i<=4;i++)

for(int j=0;j<=4;j++)

ans=min(ans,f[n][i][j]);

printf("%d

",ans);

}

3049 舞蹈家懷特先生

時間限制 1 s 空間限制 64000 kb 題目等級 gold 輸入描述 input description 第一行n,表示有n個時刻 1 n 10000 第二到n 1行,每行乙個數,表示需要踩得版 輸出描述 output description 乙個數,最小消耗體力 樣例輸入 sample in...

codevs 3049 舞蹈家懷特先生

題目描述 description 懷特先生是乙個大胖子。他很喜歡玩跳舞機 dance dance revolution,ddr 甚至希望有一天人家會腳踏 舞蹈家懷特先生 可惜現在他的動作根本不能稱作是在跳舞,儘管每次他都十分投入的表演。這也難怪,有他這樣的體型,玩跳舞機是相當費勁的。因此,他希望寫乙...

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 ...