分金子(區間dp)

2021-09-11 23:19:08 字數 1086 閱讀 1604

分金子(360公司2017春招真題)

a、b兩夥馬賊意外地在一片沙漠中發現了一處金礦,雙方都想獨佔金礦,但各自的實力都不足以吞下對方,經過談判後,雙方同意用乙個公平的方式來處理這片金礦。處理的規則如下:他們把整個金礦分成n段,由a、b開始輪流從最左端或最右端佔據一段,直到分完為止。 

馬賊a想提前知道他們能分到多少金子,因此請你幫忙計算他們最後各自擁有多少金子?(兩夥馬賊均會採取對己方有利的策略)

輸入 測試資料報含多組輸入資料。輸入資料的第一行為乙個正整數t(t<=20),表示測試資料的組數。然後是t組測試資料,每組測試資料的第一行包含乙個整數n,下一行包含n個數(n <= 500 ),表示每段金礦的含金量,保證其數值大小不超過1000。

樣例輸入 2 

4 7 2 9 5 2

140 649 340 982 105 86 56 610 340 879

輸出 對於每一組測試資料,輸出一行"case #id: sc1 sc2",表示第id組資料時馬賊a分到金子數量為sc1,馬賊b分到金子數量為sc2。詳見樣例。

樣例輸出 case #1: 18 11

case #2: 3206 981

現在也就刷刷入門題了。區間dp的核心就是每乙個小區間由小到大遞增這樣更新。

dp[i][j]代表i到j區間的最大值。經典常用題型。

**:

#includeusing namespace std;

typedef long long ll;

const int mod=1000000007;

const double pi=acos(-1);

int dp[510][510];

int sum[510][510];

int a[510];

int main()

for(int i=1;i<=n;i++)

if(dp[i+1][j]else

///dp[i][j]=max(dp[i][j],sum-min(dp[i+1][j],dp[i][j-1]));}}

//cout

cout<<"case #"<}

}

合併石子 (區間覆蓋DP)

任重而道遠 在乙個操場上一排地擺放著 堆石子。現要將石子有次序地合併成一堆。規定每次只能選相鄰的 堆石子合併成新的一堆,並將新的一堆石子數記為該次合併的得分。計算出將 堆石子合併成一堆的最小得分。第一行為乙個正整數n 2 100 以下 行,每行乙個正整數,小於10000,分別表示第i堆石子的個數 1...

合併石子(區間dp 模板題)

設有n堆沙子排成一排,其編號為1,2,3,n n 300 每堆沙子有一定的數量,可以用乙個整數來描述,現在要將這n堆沙子合併成為一堆,每次只能合併相鄰的兩堆,合併的代價為這兩堆沙子的數量之和,合併後與這兩堆沙子相鄰的沙子將和新堆相鄰,合併時由於選擇的順序不同,合併的總代價也不相同,如有4堆沙子分別為...

合併石子 區間dp水題

合併石子 描述 有n堆石子排成一排,每堆石子有一定的數量。現要將n堆石子並成為一堆。合併的過程只能每次將相鄰的兩堆石子堆成一堆,每次合併花費的代價為這兩堆石子的和,經過n 1次合併後成為一堆。求出總的代價最小值。tags 最基本的區間dp,這題範圍小,如果n大一些,還是要加個平行四邊行優化。incl...