classSolution{public:int mod =1e9+7;intcountGoodStrings(int low,int high,int zero,int one){
vector<longlong>f(1000000,0);
f[0]=1;for(int i =min(zero, one); i <1e6; i ++){if(i >= zero) f[i]=(f[i]+ f[i - zero])% mod;if(i >= one) f[i]=(f[i]+ f[i - one])% mod;}longlong res =0;for(int i = low; i <= high; i ++) res =(res + f[i])% mod;return(int)res;}};
T3 树上最大得分和路径— dfs + 模拟推导
constint N =100010;typedeflonglong LL;classSolution{public:
vector<int> g[N];int father[N], time[N];
LL res =-2e9;
vector<int> w;voiddfs(int u,int fa,int depth, LL sum){if(g[u].size()==1&& u !=0){
res =max(res, sum + w[u]);return;}for(auto v : g[u]){if(v == fa)continue;int tmp = w[time[depth]];if(u == time[depth])dfs(v, u, depth +1, sum + w[u]/2);else{
w[time[depth]]=0;dfs(v, u, depth +1, sum + w[u]);
w[time[depth]]= tmp;}}}voiddfs2(int u,int fa){if(g[u].size()==1&& u !=0)return;for(auto v : g[u]){if(v == fa)continue;
father[v]= u;dfs2(v, u);}}intmostProfitablePath(vector<vector<int>>& e,int bob, vector<int>& ww){
w = ww;for(auto vec : e){
g[vec[0]].push_back(vec[1]);
g[vec[1]].push_back(vec[0]);}dfs2(0,-1);int idx =0;while(bob !=0) time[idx ++]= bob, bob = father[bob];
time[idx]=0;dfs(0,-1,0,0);return(int)res;}};
T4 根据限制分割消息 — 暴力模拟
classSolution{public:
vector<string>splitMessage(string s,int limit){int n = s.size();
vector<int>f(n +1),sf(n +1);for(int i =1; i <= n; i ++)
sf[i]=(f[i]=to_string(i).size())+ sf[i -1];for(int i =1; i <= n; i ++){int a = limit * i - sf[i]-(3+ f[i])* i;if(a < n)continue;int b = limit *(i -1)- sf[i -1]-(3+ f[i])*(i -1);if(b > n)continue;
vector<string> res;for(int j =1, k =0; j <= i; j ++){int len = limit -3- f[i]- f[j];
res.push_back(s.substr(k, len)+"<"+to_string(j)+"/"+to_string(i)+">");
k += len;}return res;}return{};}};