C 心路歷程37 釣魚(刷表法dp)

2021-08-07 10:58:31 字數 1417 閱讀 8880

【問題描述】

約翰是個垂釣謎,星期天他決定外出釣魚h小時(1≤h≤16),約翰家附近共有n個池塘(2≤n≤25),這些池塘分布在一條直線上,約翰將這些池塘按離家的距離由近到遠編上號,依次為l1,l2,…,ln,約翰家門外就是第乙個池塘,所以他到第乙個池塘是不用花時間的。

約翰可以任選若干個池塘由近到遠地垂釣,並且在每個池塘他都可以呆上任意長的時間,但呆的時間必須為5分鐘的倍數(即5分鐘為乙個單位時間),已知從池塘li到池塘li+1要化去約翰ti個單位時間。每個池塘的上魚率預先也是已知的,池塘li在第乙個單位時間內能釣到的魚為fi(0≤fi≤100),並且每當他在某乙個魚塘呆上乙個單位時間後,該魚塘單位時間內能釣到的魚將減少乙個常數di(0≤di≤100)。

現在請你編乙個程式計算約翰最多能釣到多少魚。

【輸入格式】

第一行為乙個整數n,第二行為乙個整數h,第三行為n個用空格隔開的整數,表示fi(i=1,2,…,n),第四行為n個用空格隔開的整數,表示di(i=1,2,…,n),第五行為n-1個用空格隔開的整數,表示ti(i=1,2,…,n-1)

【輸出格式】

乙個整數,表示約翰最多能釣到魚的數量。

【輸入樣例】

2 1

10 1

2 5

2【輸出樣例】

【資料範圍】

2 ≤ n ≤ 25

1 ≤ h ≤ 16

0 ≤ ti ≤ 100

0 ≤ fi ≤ 100

0 ≤ di ≤ 100

【分析】

網上其他好多都是用的二維啊,,想不清楚,感覺也沒有那麼好轉移(狀態描述不清晰)。

設f(i,j,k)表示在前i分鐘在第j個魚塘 已經花了k分鐘 能釣到的最多魚,那麼這個時刻顯然有兩種狀態:

1、繼續在該魚塘釣魚,則狀態轉移到f(i+1,j,k+1)

2、去下乙個魚塘釣魚,則狀態轉移到f(i+t[j+1],j+1,k+t[j+1])

分析方程,不難發現這裡使用刷表法是更為簡便的,那麼方程歸納:

f(i+1,j,k+1)=max(f(i,j,k)+calc(j,k),f(i+1,j,k+1))

f(i+t[j],j+1,0)=max(f(i+t[j],j+1,0),f(i,j,k))

邊界:f(0,1,0)=0,其餘為-inf

ps 因為5分鐘為乙個時段,所以h*=12.

int calc(int i,int k)

void dp()

for(int i=0;i<=h;i++)

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

for(int k=0;k<=h;k++)

if(i+t[j+1]<=h && j+1

<=n)

ans=max(ans,f[i][j][k]);

}cout<}

C 學習心路歷程

這裡只記錄c 的特色地方,想來本科專攻c 跟圖形程式設計,真心沒想到半路殺出來個unity還特麼用了c 所以嘛,最近惡補這方面的東西,把跟c 相似的地方看看就好,這裡把c 的好東東都記錄下,有一些還挺有逼格的說,希望能有幸成為高手!1 params關鍵字 本關鍵字在於可變長引數的利用,比如 stat...

指標(心路歷程)

2019 3 10 許多初學c 語言指標的人剛開始會理不清思路,即使有教材書在比上也會一頭霧水,我也是剛入門,給一下我的想法。指標,簡單來說就是乙個存放位址的變數。你可一聯想門牌號和房子的關係。c語言的指標,主要兩種運算子。和 可以簡單理解為取值,而 可以理解為取址。例如char cp ch cp存...

心路歷程 20161118

171219我王老五又回來水題了!由於種種原因 比如不想參加本班只有四人參加的月考 本wc都去不了的蒟蒻回來準備,省選了,爭取拿到胸牌233.昨天因為不出去培訓,還被教練教育了一番quq 20天 期間單個的晚上刷水題 各種演算法的基本思想和裸的 實現 不追求比較深的內容。難度什麼的不好說 比如kmp...