講解 缺席的神官 動態規劃模型

2021-10-10 16:17:03 字數 3058 閱讀 4414

時間限制:c/c++ 1秒,其他語言2秒

空間限制:c/c++ 131072k,其他語言262144k

64bit io format: %lld

面前的巨漢,讓我想起了多年前的那次,但這個巨漢身上散布著讓人畏懼害怕的黑霧。即使看不到臉,但是威嚴卻在這個從者身邊不斷圍繞。

「吾乃七騎之中的騎士(rider),你們就是御主所說的阻擾者吧」

「是」我從雪茄盒裡面掏出一根雪茄,想稍微冷靜一下。

「那便無需多言了」和我簽訂了暫時契約的理查一世倒是直接拔劍了,如此看來查理一世的職介就是劍士(saber)。

「我看你的御主倒是沒有這個想法吧」

他似乎看出了我的想法,雖然只是亡魂的影子,但也曾是人,能洞察人心。

「您是這樣的想法嗎」理查一世把劍收了起來。

「是啊,雖然參與聖杯戰爭的御主和從者目的是實現願望,但既然是殘缺的聖杯,我也會猜想是否從者對聖杯的渴望並沒有那麼高,是否有值得交涉的餘地」

「哈」巨漢笑了,「真是大膽的妄想啊,但你應該明白聖杯顯現的方法吧,所以這一切都是不可避免的。但我也不想使用武力,解答我的困惑吧,魔術師,如果你們能回答出來,我就會放棄」

「我明白了,洗耳恭聽」

「古時有乙個懶惰的祭司,而祭司在連續m天內必須一直去神廟內工作,但祭司的怠惰在**著祭司,於是祭司決定這段時間內只選出k個連續的時間段去神廟工作,但是高階祭司(祭司的上級)又會定期對神廟內的工作人員進行點名。祭司不想因此失去這份工作,所以提前知道了高階祭司會點名n次以及每次點名的日子。所以祭司把點名的日子納入工作的日子當中的同時又盡可能的偷懶。那麼,這個祭司到底工作了多少天呢」

「這個答案很簡單,荷魯斯」

第一行輸入三個整數n,m,k (1 <= n <= 2000) (n <= m <= 10^9) (1<= k <= n),分別為高階祭司的點名次數,原本需要工作的天數和懶惰的祭司的工作次數。第二行輸入n個數字ai (1 <= ai <= m),為高階祭司檢查的日期。

輸入保證對於任意的i,j (1<= i示例1

4 100 2

20 30 75 80

17
樣例的2段為[20,30],[75,80],進行工作的最少天數為:11+6=17

先吐槽一下這道題目,哇,這個祭司好慘啊,最長要工作10^(9)天,也就是90億天,27萬年,難怪要偷懶(笑)。這道題先考察的一定是讀題能力,資訊太多,輸入的資料也很多,一不小心就會弄混(事實證明,我的第一次wa就是因為弄混了變數)

一開始我有點不太懂的是工作次數,其實我們都懂,要想偷最大的懶,最簡單的方法就是在點名的日子去就好了,其他日子都不去。

但這個祭司可能家裡離神廟比較遠(戲真多),所以每次

決定這段時間內只選出k個連續的時間段去神廟工作

也就是說如果次數比較少,那每次都要從乙個檢查日住到下乙個檢查日,然後等待第二個檢查日後的第二天捲款回家。

以題目的例子為例

4 100 2

20 30 75 80

只去兩次,那麼正常人的四維就是把每種情況都算一遍,然後把最大時間間隔的兩個日期敲掉,也就是30-75足足有44天時間都不去。

如果是三次呢?那就再敲掉20-30的9天,也就是祭司只在第20、30、75-80天在神廟,也就是8天

如果是四次呢?那當然就是4天咯,就是20、30、75、80這四天去。

嗯,不知道你有沒有冥冥的感受到,如果去1次 那就是兩端的值,去2次,那就找出最大間隔的天數然後去掉,去3次,就再減去第二大間隔的天數…

那,這後面一次的資料是不是要利用前一次資料的結果呀?那這不就是大名鼎鼎的

動態規劃

如果你不太懂動態規劃,可以看下我之前寫過的一篇文章

動態規劃27k字超詳細保姆級入門講解

下面我用下我上篇文章自創的dp設計方法

dp設計

1.明確到底是幾維的dp,是否有必要公升級維數或降低

2.如何將大問題化為小問題

3.定義陣列元素的含義,存放的數值的意義所在

4.找出dp狀態轉移方程

5.找出初始值、注意臨界值,遞推/遞迴總設計思路

問題一:

一維,最低維數了

問題二:

要計算去n次的天數,要先計算n-1;要計算n-1,要先計算n-2…最後要先計算去1次的結果

問題三:

dp[i]表示的是去i次最少要去多少天

問題四:

dp[i] = dp[i-1] - max

問題五:

初始值就是dp[1] = 最後乙個檢查日-第乙個檢查日+1

一不小心就寫了1500字了,求點贊收藏關注~

#include using namespace std;

long long int checkday[2020];

long long int dis[2020];

long long int dp[2020];

int main() }

//初始化dp

dp[1] = checkday[checktimes] - checkday[1] + 1;

//計算後邊的dp,每次都重新找最大值

for ( int i=2; i<=checktimes; i++ )

}

} dp[checktimes] = checktimes;

cout << dp[worktimes] << endl;

}

為了確保大家能夠看懂這篇文章,我盡量每字每句都詳細講解,給出證明和解釋,真心希望你能夠在閱讀此篇文章後從中多多少少有所收穫。因此每篇文章我都投入了大量的時間和精力,去舉例,去說明,去分析,如果你覺得這篇文章寫的還不錯,點讚、關注和收藏一鍵三連就是對我最大的鼓勵啦,我以後也會寫更多更高質量的文章!也歡迎一起討論指出文章可能存在的邏輯問題~

缺席的神官

廣東工業大學2019年新生賽 題目描述面前的巨漢,讓我想起了多年前的那次,但這個巨漢身上散布著讓人畏懼害怕的黑霧。即使 看不到臉,但是威嚴卻在這個從者身邊不斷圍繞。吾乃七騎之中的騎士 rider 你們就是御主所說的阻擾者吧 是 我從雪茄盒裡面掏出一根雪茄,想稍微冷靜一下。那便無需多言了 和我簽訂了暫...

2023年廣東工業大學新生賽 E 缺席的神官

題目描述 面前的巨漢,讓我想起了多年前的那次,但這個巨漢身上散布著讓人畏懼害怕的黑霧。即使看不到臉,但是威嚴卻在這個從者身邊不斷圍繞。吾乃七騎之中的騎士 rider 你們就是御主所說的阻擾者吧 是 我從雪茄盒裡面掏出一根雪茄,想稍微冷靜一下。那便無需多言了 和我簽訂了暫時契約的理查一世倒是直接拔劍了...

狀態壓縮動態規劃講解

狀態壓縮動態規劃,就是我們俗稱的狀壓dp,是利用計算機二進位制的性質來描述狀態的一種dp方式,狀壓其實是一種很暴力的演算法,因為他需要遍歷每個狀態,所以將會出現2 n的情況數量,不過這並不代表這種方法不適用 一些題目可以依照題意,排除不合法的方案,使一行的總方案數大大減少從而減少列舉 在學習狀壓dp...