【問題描述】
約翰是個垂釣謎,星期天他決定外出釣魚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...