2016程式設計實習期末考試07題上機(dp)

2021-07-14 01:10:23 字數 2101 閱讀 1215

2016程式設計實習期末考試07題上機(dp)

總時間限制: 1000ms 記憶體限制: 65536kb

描述 又到週末了,同學們陸陸續續開開心心的來到機房上機。jbr也不例外,但是他到的有點晚,發現有些機位上已經有同學正在做題,有些機位還空著。細心的jbr發現,一位同學來到機房,坐在機位i上,如果他的左右兩邊都空著,他將獲得能力值a[i];如果當他坐下時,左邊或者右邊已經有乙個人在上機了,他將獲得能力值b[i];如果當他坐下時,他的左邊右邊都有人在上機,他將獲得能力值c[i]。

同時他發現,已經在上機的同學不會受到剛要坐下的同學的影響,即他們的能力值只會在坐下時產生,以後不會發生變化;第乙個機位左邊沒有機位,最後乙個機位右邊沒有機位,無論何時坐在這兩個機位上將無法獲得c值。

這時jbr發現有一排機器還空著,一共有n個機位,編號1到n。這時有n位同學們陸陸續續來到機房,乙個乙個按照順序坐在這排機位上。聰明的jbr想知道怎麼安排座位的順序,可以使這n位同學獲得能力值的和最大呢?

輸入 第一行乙個整數n(1<= n <= 10000)

第二行n個數,表示a[i]

第三行n個數,表示b[i]

第四行n個數,表示c[i]

(1<= a[i],b[i],c[i] <=10000)

輸出乙個整數,表示獲得最大的能力值和

樣例輸入

4

1 2 2 4

4 3 3 1

2 1 1 2

樣例輸出

提示

第一位同學坐在第四個機位上,獲得能力值4;

第二位同學坐在第三個機位上,獲得能力值3;

第三位同學坐在第二個機位上,獲得能力值3;

第四位同學坐在第乙個機位上,獲得能力值4;

總和為14。

這個題考試時候沒想出來,後來再想一開始想錯了。

紛繁複雜的順序後面本質的狀態是什麼呢?

我一開始認為是乙個東西放進去時候的相鄰空位數,而且容易證明相鄰空位數總和為n+1為存在這樣順序的充分必要條件。必要性可以考慮除了最邊上外面兩個空位,其他(n-1)對相鄰空位必然被一方得到空位數,注意這一點空位一共有(n-1)+2=n+1個,證畢。充分性,可以歸納證明。首先必然存在2,將最左邊放入得到了2,若餘下來全是1,依次放完即可,若餘下有0,則必然先不動最左邊的相鄰右邊格仔a,將a右邊格仔全放完後(由歸納假設這做得到),再a放乙個0,也可以,證畢。

有了這個結論,就相當於把n+1代價,分配成代價0,1,2的物品計算最大價值。變成了乙個揹包問題,注意到一些特殊細節就好了,只可惜複雜度是o(

n2) 的,tle,這就是version 1。

後來看了whz的**,學習了version 2。只需注意一點,編號前n個格仔放完後(而不是前n個放進的格仔),編號前n個格仔的價值只與放進格仔n時候左右的空與不空和前編號n-1個格仔得分有關。所以只需要維護乙個數列dp[i][t1][t2],其中t1,t2為0時候表示左邊右邊是空的,為1時表示左邊右邊是滿的。version 2不像version 1考慮放進順序卻考慮位置順序,換了乙個角度,狀態比較簡單,繼而降了維度,做到了o(

n),想來妙絕。

version 1:

wrong answer    2   520kb   1730ms  546 b   g++
#define max_n 10000

#include

int a[max_n+1][3];

int f[max_n+4];

int n;

void test()

int main()

version 1:

accepted    10  524kb   0ms 604 b   g++
#define max_n 100000

#include

int n;

int v[max_n][3];

int dp[max_n][2][2];

inline

int max(int a,int b)

int main()

C語言期末考試程式設計題

7 1 統計學生成績 10 分 本題要求編寫程式讀入n個學生的百分制成績,統計五分制成績的分布。百分制成績到五分制成績的轉換規則 大於等於90分為a 小於90且大於等於80為b 小於80且大於等於70為c 小於70且大於等於60為d 小於60為e。輸入格式 輸入在第一行中給出乙個正整數n 1000 ...

C程式設計高階 期末考試

程式設計題 1 含k個3的數 簡單,但查到了一些東西 輸入二個正整數m 和 k,其中1 m 100000,1 k 5 判斷m 能否被19整除,且恰好含有k個3,如果滿足條件,則輸出yes,否則,輸出no。例如,輸入 43833 3 滿足條件,輸出yes 如果輸入 39331 3 儘管有3個3,但不能...

Coursera C程式設計高階 期末考試

注意 總時間限制 1000ms 記憶體限制 65536kb 輸入二個正整數m 和 k,其中1 m 100000,1 k 5 判斷m 能否被19整除,且恰好含有k個3,如果滿足條件,則輸出yes,否則,輸出no。例如,輸入 43833 3 滿足條件,輸出yes 如果輸入 39331 3 儘管有3個3,...