對局匹配 動態規劃

2021-10-05 04:16:44 字數 1271 閱讀 5873

一道動態規劃的題目,不出意外的我又不會做(淚目。。。。)下面是我參考別人部落格之後寫出來的

小明發現**的自動對局系統在匹配對手時,只會將積分差恰好是k的兩名使用者匹配在一起。如果兩人分差小於或大於k,系統都不會將他們匹配。

現在小明知道這個**總共有n名使用者,以及他們的積分分別是a1, a2, … an。

對於30%的資料,1 <= n <= 10

對於100%的資料,1 <= n <= 100000, 0 <= ai <= 100000, 0 <= k <= 100000

乙個整數,代表答案。

10 0

1 4 2 8 5 7 1 4 2 8

預處理:準備乙個陣列,陣列開闢100000+1大小,然後索引代表積分,陣列值代表此積分的人數。

第一種情況:就是當k==0時,就如樣例給出的,相當於把這些元素放在乙個集合裡面(集合具有互異性),答案就是集合的元素個數。

第二個答案:這種情況是一般的情況,即k>0的時候,這才需要我們的動態規劃演算法。

首先,把max個數分成了k組,第一組,第二組 一直到最後一組 各個組之間是互不干擾的,因為需要相差k才會相互影響。

接下來,我們就是一組一組計算了,準備乙個臨時陣列,用來儲存各組中各元素出現的次數。

然後,關鍵部分:動態規劃的的狀態轉移(下面說的p是指當前組中第p個積分,不是說積分為p):

dp[ p ] = max( dp[ p-1 ], dp[ p-2 ] +temp[ p ] )

什麼意思呢?dp值表示小於等於 第p個積分值 之中不匹配的最大人數,那第 p 個積分的狀態轉移就分為:第p個 積分的人不算,用前p-1個積分中的最大值;或者是 第 p-1 個積分的不算, 去算第p-2個積分 加上第p個積分的人數。最後,二者取最大值。

將各組的最大人數累加起來就是答案了。 **

#include

#include

#define max 100001

using

namespace std;

intmain()

int res=0;

if(k==0)

}}else

dp[0]

=temp[0]

;for

(int p=

1;p)else

} res+

=dp[s-1]

;}}printf

("%d\n"

,res)

;return0;

}

希望慢慢進步吧,動態規劃的題目我感覺自己還是沒吃透。。

藍橋杯 對局匹配 動態規劃

時間限制 1.0s 記憶體限制 256.0mb 問題描述 輸入格式 第一行包含兩個個整數n和k。第二行包含n個整數a1,a2,an。對於30 的資料,1 n 10 對於100 的資料,1 n 100000,0 ai 100000,0 k 100000 輸出格式 乙個整數,代表答案。樣例輸入 10 0...

藍橋杯 對局匹配(動態規劃)

小明發現 的自動對局系統在匹配對手時,只會將積分差恰好是k的兩名使用者匹配在一起。如果兩人分差小於或大於k,系統都不會將他們匹配。現在小明知道這個 總共有n名使用者,以及他們的積分分別是a1,a2,an。對於30 的資料,1 n 10 對於100 的資料,1 n 100000,0 ai 100000...

藍橋杯對局匹配及動態規劃

在這道題目中,我們就需要運用到動態規劃的知識。在我們學習動態規劃前我們或許會用bfs,dfs,遞迴來寫這道題,但是,我們不難發現當我們使用前面三個演算法的時候,我們的時間複雜度會很高。是n n次方,當n是乙個較大的值的時候,我們必然會超時,其中的原因很大是因為我們出現了重疊子問題的現象。而動態規劃就...