在某一條不知名世界線的岡倫今天突然接到了一條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...