HNOI2004 打鼴鼠 解題報告

2021-06-29 14:59:54 字數 1019 閱讀 8748

這個題一上來就想到了是o(

m2) 的dp,但是沒有想到優化,導致跑得比較慢。

當然其實對於這個題而言優化有無是無所謂的,但是這個優化的思想還是很好的。

我一開始是想得用前面的去更新後面的,而如果我們反著來想的話,就可以發現乙個優化了。 設f

i 表示最後到i可以取得的最大數量,那麼顯然有方程fi

=max

這時假如我們從大到小列舉j,那麼顯然存在更小的j使得i被更新的必要條件是存在更小的j使得fj

+1>fi

,也就是說只要我們搞個字首最大值就可以剪枝了。

當然,這實際上並不能在減弱其最壞時間複雜度,(我們只需要讓第乙個點time=1,而剩下所有點都time=2就可以做到這點了。)但對於隨機資料來說則能提高100倍左右,效果是驚人的;因為直觀上來看,隨下標的遞增,f陣列是趨向於越來越大的。

通過這道題,讓我們看到了前/字尾max在剪枝中的重要應用,我們在暴搜和卡常數的時候一定要想著他。

**(樸素版):

#include

#include

#include

using

namespace

std;

int x[10005],y[10005],t[10005];

int f[10005];

int main()

printf("%d\n",ans);

}

**(剪枝版):

#include

#include

#include

using

namespace

std;

int x[10005],y[10005],t[10005];

int f[10005],b[10005];

inline

int in()

int main()

printf("%d\n",b[m]);

}

HNOI 2004 敲磚塊 解題報告

hnoi2004 敲磚塊 一道dp題,把其看成乙個直角三角形,敲第 i 列的第j塊時,第i 1列至少是敲了j 1 塊的 s i j k 是敲掉第 i 列第 j塊一共敲了 k 塊的最大分值,那麼轉移方程為 s i j k max s i 1 h k j j 1 h n i h 1 ja h i 時間複...

HNOI2004 敲磚塊 解題報告

p1437 敲磚塊 很自然地,看到這道題我們會想到數字三角形。可惜的是,我們發現 不能簡單地將乙個點的左上角與右上角的值進行比較,因為選擇數可能會有重疊。不妨畫畫圖,看看我們選擇的是怎樣乙個圖形把。比如上面這個東西。我們發現,選擇的數永遠是若干個三角的重疊。我們考慮按照這個輪廓進行轉移。令 sum ...

題解 P2285 HNOI2004 打鼴鼠

現在知道在一段時間內,鼴鼠出現的時間和地點,請編寫乙個程式使機械人在這一段時間內打死盡可能多的鼴鼠。首先,座標為 x,y 到座標為 a,b 的網格需要的時間為 x a y b 由於題目已經自動幫我們按時間排好序了,所以,我們可以直接 dp 考慮揹包 include using namespace s...