DP 離散化 命運石之門的選擇

2021-09-17 23:03:28 字數 1485 閱讀 2307

在某一條不知名世界線的岡倫今天突然接到了一條dmail,上面說世界線將會發生巨大變動,未來的他無論如何都無法扭轉這種變動回到原來的世界線。而世界線變動的原因是現在的他不久後錯過了與助手的約會。他約好要和助手去約會,但是在去約會之前,由於一直拖欠房租,房東大叔要求他幫忙完成一幅畫的上色,然而他沒有以最快的速度完成這個任務,導致他錯過了與助手的約會,從而導致世界線的劇變。現在到了拯救世界的時候,由於岡倫並不擅長畫畫,於是他找到了同樣不擅長畫畫的你來幫他解決這個問題(這是命運石之門的選擇)。不管怎樣現在拯救世界的重任交到了你的手上,而你雖然不擅長畫畫,但是你可以使用程式設計來幫助你解決這個問題。

這幅畫十分抽象:它由n個寬度為1高度為hi的矩形組成,矩形併排排列,相鄰的矩形間沒有空隙,初始情況下每個矩形都是沒有顏色的。你有乙個寬度為1的刷子,你可以豎直或水平的刷,每次使用刷子,你的刷子都必須保證一直全部處於矩形中,即不能刷到矩形以外的地方去,當然你每次刷的時候也不能拐彎。你每刷一次,要花費1的時間,這和刷的長度無關,比如你可以從最左邊刷到最右邊(當然是不經過矩形以外的部分),這也只花費1的時間。你的目的是將全部的矩形都塗滿顏色。請輸出這個最短的時間,以便岡倫決定是自己來完成這個任務還是讓你來做苦力。

input

第1行:乙個正整數n,表示矩形的個數。

接下來n個正整數hi,表示第i個矩形的高度。

output

乙個整數,表示最少花費的時間。

dp+離散化。設f[i][j]為前i個全部刷完,其中橫著刷了j行。

然後可以從前面連過來,也可以新開幾行,然後不夠的豎著刷。

離散化-大概就是壓縮高度。。。第幾高地存。

#include

#include

#include

#include

using

namespace std;

int n,a[

5001

],c[

5001

],f[

5001][

5001

],m,ans=

0x7f

;int

main()

sort

(c+1

,c+1

+n);

//排序

m=unique

(c+1

,c+1

+n)-

(c+1);

//去重

memset

(f,0x3f

,sizeof

(f))

; f[0]

[0]=

0;for(

int i=

1;i<=n;

++i)

for(

int i=

0;i<=m;

++i)

ans=

min(ans,f[n]

[i])

;//取最小步數

printf

("%d"

,ans)

;}

離散化 DP 命運石之門的選擇

有n個盒子,高度為ai,可以數值刷盒子,也可以橫著刷,但如果前面沒盒子了,就要停下,問刷完這些盒子最少要刷多少次 在某一條不知名世界線的岡倫今天突然接到了一條dmail,上面說世界線將會發生巨大變動,未來的他無論如何都無法扭轉這種變動回到原來的世界線。而世界線變動的原因是現在的他不久後錯過了與助手的...

DP 命運石之門的選擇

在某一條不知名世界線的岡倫今天突然接到了一條dmail,上面說世界線將會發生巨大變動,未來的他無論如何都無法扭轉這種變動回到原來的世界線。而世界線變動的原因是現在的他不久後錯過了與助手的約會。他約好要和助手去約會,但是在去約會之前,由於一直拖欠房租,房東大叔要求他幫忙完成一幅畫的上色,然而他沒有以最...

day2 命運石之門(卷積)

出題人題解 對質數p,計算其原根為g。這樣可以將ai寫成g bi的形式。於是乘法就變成了質數的加法,直接利 用fft進行計算即可。需要注意的是要對ai 0的情況特殊處理。my answer 原根的性質忘了,先跳過 qaq 總之可以 1,p 1 的ai全對映成了 1,p 1 的bi。令f x 為對於b...