小明今天得到乙個跳舞毯遊戲程式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,但很少有人知道很多任務都不是他親自完成的,而是由他的堂弟們吉公尺邦德完成 他有很多堂弟 詹姆斯已經厭倦了把乙個個任務分配給乙個個吉公尺,他向你求助。每個月,詹姆斯都會收到一些任務,根據他以前執行任務的經驗,他計算出了每個吉公尺完成每個任務的成功率,要求...