hdu4472 記憶化搜尋

2021-09-24 02:21:53 字數 1137 閱讀 3123

看到這題,第一反應是找規律,寫個暴力dfs看看有啥規律,實在看不出來,但是覺得這個暴力可以優化,加了個dp陣列,過了,喜大普奔

第一次**是這樣的

#include #include #include #include #include #include #include #include using namespace std;

typedef long long ll;

const ll mod=1e9+7;

ll dp[1005];

void dfs(int id,int n)

if(n==0)

for(int i=1;i<=n;i++)

}}int main()

return 0;

}

看起來比較臃腫,但比賽的時候想不了那麼多了,過乙個是乙個。賽後又精簡了一下

#include #include #include #include #include #include #include #include using namespace std;

typedef long long ll;

const ll mod=1e9+7;

ll dp[1005];

ll dfs(int n)

int main()

return 0;

}

後來又想了一下,其實很簡單,可以直接用dp方程推,i個節點有dp[i]種排法,那麼可以對於這種i個節點的樹,可以拿k個出來,把他們的根節點連到同乙個節點上去,形成乙個ki+1個節點的樹,這個樹也是滿足條件的,那麼dp[ki+1]+=dp[i],初始值dp[1]=1,按素數篩那種寫法,倒著推一遍就完事了。

#include #include #include #include #include #include #include #include using namespace std;

typedef long long ll;

const ll mod=1e9+7;

const int maxn=1e3+5;

int n,cas=1;

ll dp[maxn];

int main()

hdu3779 記憶化搜尋

兩列火車入站,重新排列的車廂符不符合要求 記憶化搜尋,ans i j 記錄的是第一列火車的第i節和第二列火車的第j列在組合後的序列裡找不找的到 如果找的到就標記為1,因為是從前到後搜尋,所以在ans n m 1時,表示符合 include include includeusing namespace...

hdu2452 記憶化搜尋

一顆樹,邊是單向的,每個節點有一定的權值,要你從根節點走到葉子節點,走到第偶數節點時,使後面的權值和最小 走到第奇數節點時,使後面的權值和最大 邊鍊錶儲存,並查集查詢根節點 用val i 0 表示第i個節點是偶數節點的值和val i 1 表示第i個節點是奇數節點的值 遞迴的計算,因為節點很多,所以要...

hdu1069 記憶化搜尋

此題思路還是比較清晰的,對於每個x,y,z,都會有三種情況,dp i 表示把第i個放在最下面得到的最大高度,狀態轉移方程為dp i max dp i dp j height 這裡的j要滿足能夠放在i上面,height為第i個矩形的高度 如下 include include include inclu...