一道動態規劃的題目,不出意外的我又不會做(淚目。。。。)下面是我參考別人部落格之後寫出來的
小明發現**的自動對局系統在匹配對手時,只會將積分差恰好是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是乙個較大的值的時候,我們必然會超時,其中的原因很大是因為我們出現了重疊子問題的現象。而動態規劃就...