跳舞 紀中2545 dp

2021-07-16 13:47:18 字數 1343 閱讀 6167

小明今天得到乙個跳舞毯遊戲程式dance。遊戲每次連續出n 個移動的「箭頭」,箭頭依次標號為1 到n,並且的相應的分數s[1..n]。如果你能「踏中」第i 號箭頭,你將獲得相應的分數s[i];否則將被扣除相應的分數。

另外,遊戲還有乙個累計獎勵機制:如果踏準次數累計達到t,並且是在踏中第i個箭頭達到的,則將得到b[i]的獎勵分數,累計也將清零,重新開始。

例如:n=6,t=3,相應的s 和b 分別為、,如果小明踏中所有箭頭,則得分為:(1+2+3+4)+(4+5+6+10)=35

小明是個dance 高手,可以踏中他想踏中的任意乙個箭頭。但他發現,根據給定的n,t,s,b,踏中所有的箭頭不一定能得最高分,小明很想知道最高能得多少分,你能幫助小明計算一下最多可得多少分嗎?

第一行兩個整數n 和t。

第二行n 個整數,為s 的相應分數。

第三行也有n 個整數,為b 的相應分數。

只乙個整數,可得到的最高分數。

對於20%的資料0≤n,t≤100;

對於100%的資料0≤n,t≤5000;

s 和b 各有n 個數,所有分數為[0,10000]之間的整數。f[

i][j

] 表示前i項共選了j項的最大獲益f[

i][j

]=max(f[

i−1]

[j]−

s[i]

,f[i

−1][

j−1]

+s[i

])

當j為t的倍數f[

i][j

]=max(f[

i−1]

[j]−

s[i]

,f[i

−1][

j−1]

+s[i

]+b[

i])

固定 f[

i][0

] 只能從 f[

i−1]

[0] 轉移

i可以滾,所以陣列很小

#include 

#include

using

namespace

std;

int max(int x,int y)

long

long f[2][5100];

int a[5100];

int b[5100];

int main()

x=x^1;

}for (int i=0;i<=n;i++)

if (f[x^1][i]>ans)

ans=f[x^1][i];

printf("%lld\n",ans);

return

0;}

區間 紀中1382 dp

alice收到一些很特別的生日禮物 區間。即使很無聊,alice還是能想出關於區間的很多遊戲,其中乙個是,alice從中選出最長的不同區間的序列,其中滿足每個區間必須在禮物中,另序列中每個區間必須包含下乙個區間。程式設計計算最長序列的長度。輸入檔案第一行包含乙個整數n 1 n 100000 表示區間...

書架 紀中2931 dp 堆

題目大意 當farmer john閒下來的時候,他喜歡坐下來讀一本好書。多年來,他已經收集了n本書 1 n 100,000 他想要建立乙個多層書架,來存放它們。每本書 i 擁有乙個寬度 w i 和乙個高度 h i 所有的書需要按順序,放到書架的每一層。舉例來說,第一層書架放k本書,應該放書1.k 第...

邦德 紀中 1236 狀壓dp

題目大意 每個人都知道詹姆斯邦德,著名的007,但很少有人知道很多任務都不是他親自完成的,而是由他的堂弟們吉公尺邦德完成 他有很多堂弟 詹姆斯已經厭倦了把乙個個任務分配給乙個個吉公尺,他向你求助。每個月,詹姆斯都會收到一些任務,根據他以前執行任務的經驗,他計算出了每個吉公尺完成每個任務的成功率,要求...