在這道題目中,我們就需要運用到動態規劃的知識。
在我們學習動態規劃前我們或許會用bfs,dfs,遞迴來寫這道題,但是,我們不難發現當我們使用前面三個演算法的時候,我們的時間複雜度會很高。是n^n次方,當n是乙個較大的值的時候,我們必然會超時,其中的原因很大是因為我們出現了重疊子問題的現象。而動態規劃就能很好的規避這個問題
(動態規劃入門傳送門:
思路
動態規劃主要是來對問題的拆分,使其變成若干的子問題,再通過若干子問題的解決來實現對最初問題的解決,所以我們首先需要考慮的是對於問題的拆分,即我們如何講我們所需要的問題拆分成若干子問題,並且將著若干子問題都使用狀態轉移方程式來實現鏈結。
在對局匹配中分數差值k是乙個關鍵資訊,在差值不為k的時候系統將不會進行匹配,所以可以將狀態轉移公式的變數定為k。
我們容易知道,當我所有的數值<=k的時候,我們可以將我們所擁有的積分資訊進行以k為等差的分類,我們將其分為n組,在這n組中,每一組的首元素都不超過k的值(因為當我們的陣列值的首元素超過了k的時候,便會出現重複的情況)。
當我們將其分為了n個陣列之後,我們可以容易的知道,每乙個的分組都不會於其他分組的匹配到一起,所以我們的思路就轉變為單獨求每一組的最大不能匹配數,然後將每一組的單獨最大不能匹配數相加就是我們的答案。
**
#include
#include
#include
#include
using
namespace std;
#define max_score 1000
const
int maxn=
100000+5
;int cnt[max_score+5]
,val[maxn]
,dp[maxn]
;int n,k;
intmain()
//特殊處理k=0的情況
if(k==0)
}else
//使用新的陣列dp來進行儲存
dp[0]
=val[0]
;//其值為首元素的個數
for(
int j=
1;j) ans+
=dp[m-1]
;}} cout
;}
藍橋杯 對局匹配 動態規劃
時間限制 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...
對局匹配(藍橋杯)
小明發現 的自動對局系統在匹配對手時,只會將積分差恰好是k的兩名使用者匹配在一起。如果兩人分差小於或大於k,系統都不會將他們匹配。現在小明知道這個 總共有n名使用者,以及他們的積分分別是a1,a2,an。第一行包含兩個個整數n和k。第二行包含n個整數a1,a2,an。對於30 的資料,1 n 10 ...