HDU 2182 Frog,動態規劃

2021-07-25 17:41:17 字數 1473 閱讀 9179

此題不算難,不過鑑於討論區及網路相關題解較少,我認為還是有寫一下的必要。

直接介紹思想:

①對於每一次的跳躍必定存在最大值

②本次跳躍的最大值為 :max(上一次跳躍中的某個結果 + 該結果對應位置可以獲得的最大甲蟲數)

#注意到本次的最大值不一定來自於 上次的最大值+該位置對應可以獲得的最大甲蟲數,因此我們要記錄上一次跳躍的所有結果(即mapa[i-1][1] 到mapa[i-1][n] 中所有不為-1的點)

③遍歷上次跳躍的每乙個結果,計算它對應可獲得的最大值mapa[i][j]+num[pos]。同時將結果儲存至mapa[i-1][pos]便於下一次跳躍的計算。

且如果已知的最大值con如此經過k次跳躍後con中所得到的即是結果。

還是看不太懂?沒關係,結合**注釋一起看:

#include #include #include #include #include #include #include #include #define in freopen("in.txt", "r", stdin)

#define out freopen("out.txt", "wb", stdout)

#define max(a, b) (((a) > (b)) ? (a) : (b))

#define min(a, b) (((a) < (b)) ? (a) : (b))

#define n 110

using namespace std;

int main()

{ int i,j,h,t,low,high,con; //low~high代表該次跳躍允許起跳位置的範圍,con用於儲存結果

int n,a,b,k; //n、a、b、k同題意

int num[n],mapa[n][n]; //num[i]用於記錄每一格的甲蟲數,mapa[i][j]代表到第j格時還可以跳i次

cin>>t;

while(t-->0)

{cin>>n>>a>>b>>k;

if(k>n) //當k>n時視為k=n (因為多了的也用不上,總共才n個格仔)

k=n;

for(i=1;i<=n;i++)

cin>>num[i];

for(i=0;i<=k;i++)//初始化

for(j=1;j<=n;j++)

mapa[i][j]=-1;

mapa[k][1]=con=num[1];

low=high=1; //初始化

for(i=k;i>0;i--)

{ //nextlow、nexthigh分別用來記錄該行經過運算產生的結果中的最近、最遠位置(用於節省時間,也可以暴力遍歷位置1~n)

int nextlow=n,nexthigh=0;

for(j=low;jcon)

con=mapa[i-1][h+j];

if(nextlow>h+j)

nextlow=h+j;

if(nexthigh

hdu2159 動態規劃

problem description 最近xhd正在玩一款叫做fate的遊戲,為了得到極品裝備,xhd在不停的殺怪做任務。久而久之xhd開始對殺怪產生的厭惡感,但又不得不通過殺怪來公升完這最後一級。現在的問題是,xhd昇掉最後一級還需n的經驗值,xhd還留有m的忍耐度,每殺乙個怪xhd會得到相應的...

hdu 1257 動態規劃

problem description 某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統.但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能超過前一發的高度.某天,雷達捕捉到敵國的飛彈來襲.由於該系統還在試用階段,所以只有一套系統,因此有可能不能攔截所有...

hdu1978動態規劃

還算比較好理解的動態規劃 題意 這是乙個簡單的生存遊戲,你控制乙個機械人從乙個棋盤的起始點 1,1 走到棋盤的終點 n,m 遊戲的規則描述如下 1.機械人一開始在棋盤的起始點並有起始點所標有的能量。2.機械人只能向右或者向下走,並且每走一步消耗一單位能量。3.機械人不能在原地停留。4.當機械人選擇了...