此題不算難,不過鑑於討論區及網路相關題解較少,我認為還是有寫一下的必要。
直接介紹思想:
①對於每一次的跳躍必定存在最大值
②本次跳躍的最大值為 :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.當機械人選擇了...