在某一條不知名世界線的岡倫今天突然接到了一條dmail,上面說世界線將會發生巨大變動,未來的他無論如何都無法扭轉這種變動回到原來的世界線。而世界線變動的原因是現在的他不久後錯過了與助手的約會。他約好要和助手去約會,但是在去約會之前,由於一直拖欠房租,房東大叔要求他幫忙完成一幅畫的上色,然而他沒有以最快的速度完成這個任務,導致他錯過了與助手的約會,從而導致世界線的劇變。現在到了拯救世界的時候,由於岡倫並不擅長畫畫,於是他找到了同樣不擅長畫畫的你來幫他解決這個問題(這是命運石之門的選擇)。不管怎樣現在拯救世界的重任交到了你的手上,而你雖然不擅長畫畫,但是你可以使用程式設計來幫助你解決這個問題。
這幅畫十分抽象:它由n個寬度為1高度為hi的矩形組成,矩形併排排列,相鄰的矩形間沒有空隙,初始情況下每個矩形都是沒有顏色的。你有乙個寬度為1的刷子,你可以豎直或水平的刷,每次使用刷子,你的刷子都必須保證一直全部處於矩形中,即不能刷到矩形以外的地方去,當然你每次刷的時候也不能拐彎。你每刷一次,要花費1的時間,這和刷的長度無關,比如你可以從最左邊刷到最右邊(當然是不經過矩形以外的部分),這也只花費1的時間。你的目的是將全部的矩形都塗滿顏色。請輸出這個最短的時間,以便岡倫決定是自己來完成這個任務還是讓你來做苦力。
第1行:乙個正整數n,表示矩形的個數。
接下來n個正整數hi,表示第i個矩形的高度。
乙個整數,表示最少花費的時間。
輸入樣例
5
2 2 1 2 1
輸出樣例3
【資料規模】
30% n<=20, hi<=100
60% n<=100, hi<=1000
100% n<=5,000, hi<=10^9dpf[i
][j]
f[i][j]
f[i][j
]代表前i
ii個柱子從下往上橫著刷到j
jj滾動陣列注意
i
ii可以寫成i
ii&111i
−1
i-1i−
1可以寫成~i
ii&1
11
#include
#include
#include
#include
#include
using
namespace std;
int height[
5025
],h[
5025
],f[2]
[5025];
int ans,n,m,minn;
intmain()
sort
(h+1
,h+n+1)
; m=
unique
(h+1
,h+n+1)
-(h+1)
;//去重
memset
(f,0x3f
,sizeof
(f))
; f[0]
[0]=
0;minn=
2147483647
;for
(int i=
1;i<=n;
++i)
for(
int j=
0;j<=m;
++j)
for(
int j=m-
1;j>=0;
--j)
f[i&1]
[j]=
min(f[i&1]
[j+1
],f[i&1]
[j]);}
printf
("%d"
,minn)
;return0;
}
離散化 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...