看到這題,第一反應是找規律,寫個暴力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...