牛客練習賽40 題解(部分)

2021-09-11 01:41:46 字數 1017 閱讀 5737

官方題解:

a-小d的劇場

大概意思就是,有1~49個數,代表著不同的音符,問你能組成長度為n的串有多少種(mod 109+7)。有若干個限制,比如1 2 3,就是1,2,3不能放在一起,然後問你在這些限制下有多少種不同的長度為n的串。

3≤n≤500,0≤q≤117649,1≤a,b,c≤49

思路

看到這題,想到hdu2047,不難想到dp的方法,就是乙個暴力的dp題。dp[i][j][k]代表長度為i,第i個位置為j,第i-1個位置為k的種數,狀態轉移方程為:dp[i][j][k]+=dp[i-1][k][l],預處理好vis[j][k][l]是否能放在一起。

**

#includeusing namespace std;

typedef long long ll;

const ll mod=1e9+7;

ll n,q;

ll a,b,c;

ll vis[50][50][50];

ll dp[510][50][50];

int main()s[maxn];

bool cmp(node i,node j)edges[maxn*2];

ll head[maxn],ecnt;

void init()

void add(ll from,ll to,ll w)

void dfs(ll root,ll pra)

if(dp[son][0]+edges[i].w > dp[root][1]) dp[root][1]=dp[son][0]+edges[i].w;}}

ans=max(ans,dp[root][0]+dp[root][1]);

}int main()

ans=-1;

dfs(1,0);

printf("%lld\n",sum*2-ans);

}

牛客練習賽40

題目鏈結 c題 小a與尤拉路 先考慮迴路的情況。由於是一棵樹,任兩點間路徑只有一條,從一條邊走到深度更大的點,一定還會從同一條邊返回以回到起點或者遍歷其他子樹,所以每條邊需要複製一次,此時答案是邊權和的兩倍。不是迴路的情況可以減掉從終點回到起點的路徑,要讓這條路徑盡量長,所以長度一定是直徑的長度。答...

牛客練習賽22題解

簡單瞎搞題 不會用bitset,所以沒做出來。實際上還是比較簡單的。include using namespace std bitset 1000005 dp 2 int main cout 2 count 簡單資料結構1 這裡要運用拓展尤拉定理。ab modp ab p b p p 0 modp ...

題解 牛客練習賽51

字首a的數量,字尾c的數量,遇到b就計算一次答案。includeusing namespace std typedef long long ll const int n 1e5 100 char s n int cnt n int main int tmp 0 for int i 1 i n i p...