P2800 又上鎖妖塔 dp

2021-09-27 15:29:03 字數 2244 閱讀 2314

傳送門

思路 : 仙劍啊 必須有題解!

思路:一道動態規劃題,你可以有三種選擇,跳一層,二層,或花費時間爬一層。所以每次在這三種狀態裡選擇最小的即可。

相似題型 美元匯率

/**

* from:

* qingdao agricultural university

* created by xiangwangacmer

* date : 2019-10-04-10.46.13

* talk is cheap.show me your code.

*/#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define ll long long

using

namespace std;

const ll maxn =

1e6+5;

const ll minn =

1e9+5;

const ll mod =

1000000007

;const

int inf =

0x3f3f3f3f

;const

long

long limit =

4294967295ll

;vector<

int>v[maxn]

;int dp[maxn]

;vector<

int>g[maxn]

;bool row[maxn]

, col[maxn]

;bool flag =0;

int w[maxn]

;queue<

int>q;

intmain()

另一種解法

開乙個二維陣列

兩種狀態:0為當前不用法術 1為使用法術

dp[i][0

]=min(dp[i-1]

[1],dp[i-2]

[1])

; dp[i][1

]=min(dp[i-1]

[0],dp[i-1]

[1])

+w[i]

;

/**

* from:

* qingdao agricultural university

* created by xiangwangacmer

* date : 2019-10-04-10.46.13

* talk is cheap.show me your code.

*/#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define ll long long

using

namespace std;

const ll maxn =

1e6+5;

const ll minn =

1e9+5;

const ll mod =

1000000007

;const

int inf =

0x3f3f3f3f

;const

long

long limit =

4294967295ll

;vector<

int>v[maxn]

;int dp[maxn][2

];vector<

int>g[maxn]

;bool row[maxn]

, col[maxn]

;bool flag =0;

int w[maxn]

;queue<

int>q;

intmain()

cout<<

min(dp[n][0

],dp[n][1

])

}

P2800 又上鎖妖塔

看,題面被吃掉了!這道題是一道經典的dp,難點在於怎樣列狀態轉移方程。首先,我們要將原問題 爬到第n層的最小時間 分解成若干個子問題。我在分解子問題的時候遇到了一點點小困難。題目限制不能連續飛躍,因此怎樣定義狀態是解題的關鍵 我們定義f i 表示到達第i層的時候爬上去的最大值 因此我們很容易地找到它...

洛谷P2800 又上鎖妖塔

小d在x星買完了想要的東西,在飛往下乙個目的地的途中,正無聊的他轉頭看了看身邊的小a,發現小a正在玩 仙劍 可是小a很奇怪,他一直在鎖妖塔的周圍轉來轉去,可是就是不進去,於是小d問他 你在幹什麼?怎麼不上去?小a說 我在想怎麼從鎖妖塔外面爬上去 倒 鎖妖塔的建造很特別,塔總共有n層,但是高度卻不相同...

洛谷 P2800 又上鎖妖塔

小d在x星買完了想要的東西,在飛往下乙個目的地的途中,正無聊的他轉頭看了看身邊的小a,發現小a正在玩 仙劍 可是小a很奇怪,他一直在鎖妖塔的周圍轉來轉去,可是就是不進去,於是小d問他 你在幹什麼?怎麼不上去?小a說 我在想怎麼從鎖妖塔外面爬上去 倒 鎖妖塔的建造很特別,塔總共有n層,但是高度卻不相同...