【問題描述】
陳老師喜歡網購書籍,經常一次購它個百八十本,然後拿來倒賣牟取暴利。前些天,高一的新同學來了,他便像往常一樣兜售他的書,經過一番口舌,同學們決定買他的書,但是陳老師桌上的書有三堆,每一堆都有厚厚的一疊,他要想個辦法用最輕鬆的方式把書拿下來給同學們。但是你想逗一下陳老師,於是你設計乙個最累的方式給他。若告訴你這三堆分別有i,j,k本書,以及每堆從下到上書的質量,每次取書只能從任一堆的最上面取,那麼請你設計乙個方案,讓他花最大的力氣取下所有的書。
顯然,每次取書陳老師的體力消耗都會加大,這裡用體力係數代表,取下第一本書時,體力係數為1,第二本書時體力係數為2,依次類推,而每次體力消耗值則為體力係數與書的重量之積。
舉個例子:三堆書及重量如下:
2 10 3
第一堆 第二堆 第三堆
顯然最累的取書方案是:右左左中,即:3*1+9*2+2*3+10*4=67。
【輸入】
第一行3個整數,分別為三堆書的數量i,j,k 第二行至第四行分別為每堆由下至上的書本重量 【輸出】
輸出最累方式的體力消耗總值。
【樣例】
book.in
3 2 4
2 3 2
1 5
9 8 7 4
book.out
257
【資料規模】
對於40%的資料有0≤i,j,k<10; 對於100%的資料有0≤i,j,k<100
【題解】
很容易想到是dp,因為假如說f[i][j][k]表示第一堆取了前i本,第二堆取了前j本,第三堆取了前k本的最大體力值,那麼這種狀態的表示對以後是沒有影響的,也就是說滿足了無後效性和最優子結構。
那麼方程就很簡單了,f[i][j][k]從前乙個狀態遞推出來的話只有三種情況:上一步從第1堆取,上一步從第2堆取,上一步從第3堆取。
【**】
#include#include#include#define inf 2100000000
using namespace std;
int i,j,k;
int a[105],b[105],c[105],f[105][105][105];
int main()
printf("%d\n",f[i][j][k]);
}
校內互測 回文詞
大意 給出一篇文章 包括字母非字母以及換行符 判斷長度大於n的回文詞的個數,並將每乙個回文詞輸出 回文中心相同的算乙個,且只輸出最長的 注意 判斷時忽略非字母字元和大小寫,但是輸出時全部輸出 包括換行符 題解 列舉回文中心即可,注意回文詞個數為奇數或是偶數要分別討論,讀入時要注意用getchar把所...
老陳,小石頭
using system using system.collections.generic using system.componentmodel using system.data using system.drawing using system.linq using system.text u...
6 13校內互測 DP 帶權二分 斜率優化
丘中有麻plant 改自這兒,by zbq。還有隱藏的一頁不放了。直接走下去的話,如果開始時間確定那麼到每個點的時間確定,把time減去dis就可以去掉路程的影響了。這樣對於減去d後的t,如果想要摘一部分,那麼應是取其中最大的t恰好摘它,其它t較小的會早熟然後等著。意會一下吧 所以t大的會對t小的產...