總時間限制: 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
樣例輸出
14
提示
第一位同學坐在第四個機位上,獲得能力值4;
第二位同學坐在第三個機位上,獲得能力值3;
第三位同學坐在第二個機位上,獲得能力值3;
第四位同學坐在第乙個機位上,獲得能力值4;
總和為14。
解題思路
該題用動態規劃解決。
首先找到動態方程dp:
假設dp[i][0]表示第i個位置左右都沒有人,dp[i][1]表示第i個位置左邊有人右邊沒人,dp[i][2]表示第i個位置右邊有人左邊沒人,dp[i][3]表示第i個位置左右都有人。那麼,
dp[i][0]=max(dp[i-1][2],dp[i-1][3])+a[i];
dp[i][1]=max(dp[i-1][0],dp[i-1][1])+b[i];
dp[i][2]=max(dp[i-1][2],dp[i-1][3])+b[i];
dp[i][3]=max(dp[i-1][0],dp[i-1][1])+c[i];
**:
#include#includeusing namespace std;
int dp[10001][4];
int main()
for(int i=1;i<=n;i++)
for(int i=1;i<=n;i++)
dp[1][0]=a[1];
dp[1][1]=0;
dp[1][2]=b[1];
dp[1][3]=0;
for(int i=2;i<=n;i++)
printf("%d\n",max(dp[n][0],dp[n][1]));
return 0;
}
之前一直執行超時,發現陣列開小了,把10001寫成了1001。 百練oj2816 紅與黑
總時間限制 1000ms 記憶體限制 65536kb 描述 有一間長方形的房子,地上鋪了紅色 黑色兩種顏色的正方形瓷磚。你站在其中一塊黑色的瓷磚上,只能向相鄰的黑色瓷磚移動。請寫乙個程式,計算你總共能夠到達多少塊黑色的瓷磚。輸入包括多個資料集合。每個資料集合的第一行是兩個整數w和h,分別表示x方向和...
百練OJ 2815 城堡問題 DFS
1 2 3 4 5 6 7 1 2 3 4 圖 1 wall no wall no wall 圖1是乙個城堡的地形圖。請你編寫乙個程式,計算城堡一共有多少房間,最大的房間有多大。城堡被分割成m n m 50,n 50 個方塊,每個方塊可以有0 4面牆。input 程式從標準輸入裝置讀入資料。第一行是...
百練OJ 4151 電影節
總時間限制 1000ms 記憶體限制 65536kb 描述 大學生電影節在北大舉辦 這天,在北大各地放了多部電影,給定每部電影的放映時間區間,區間重疊的電影不可能同時看 端點可以重合 問李雷最多可以看多少部電影。輸入 多組資料。每組資料開頭是n n 100 表示共n場電影。接下來n行,每行兩個整數 ...