CF DP题练习
< *1800
I 545C. Woodcutters *1500
可以贪心,不过我是来练
我们设
可以列出方程直接写即可。
n = read();
F(i,1,n)a[i].x = read(),a[i].h = read();
f[1][0] = 1;if(a[2].x - a[1].x > a[1].h)f[1][2] = 1;
a[n+1].x = inf;
F(i,2,n){
f[i][1] = max(f[i-1][0],max(f[i-1][1],f[i-1][2]));
if(a[i].x - a[i-1].x > a[i].h)f[i][0] = max(f[i-1][0],f[i-1][1]) + 1;
if(a[i].x - a[i-1].x > a[i].h + a[i-1].h)f[i][0] = max(f[i][0],f[i-1][2]+1);
if(a[i+1].x - a[i].x > a[i].h)f[i][2] = max(f[i-1][0],max(f[i-1][1],f[i-1][2])) + 1;
}
printf("%lld\n",max(f[n][0],max(f[n][1],f[n][2])));
II 166E. Tetrahedron *1500
我们定义
则
III 1418C. Mortal Kombat Tower *1500
考虑
则可以列出状态转移方程为:
注意一下多测不能直接 memset
IV 431C. k-Tree *1600
我们令
*1800 ~ *2200
I 1997C.Nikita and LCM *1900
我们令
若
否则,我们可以以因数表示为 状态,线性转移即可。
状态可以存到
复杂度
int t,n,ans;
ll a[N],mx,lc;
ll lcm(ll x,ll y){
if(x > 1e9 || y > 1e9)return inf;
return x * y / __gcd(x,y);
}
set<ll>st;
map<ll,int>f,v,g;
void solve(){
st.clear(),f.clear(),v.clear();
st.insert(1);
f[1] = 0,ans = 0;
for(int i = 1;i <= n;i++){
v[a[i]] = 1;g = f;//需要一个转移数组 g
for(auto state:st){
ll x = lcm(state,a[i]);
f[x] = max(f[x],g[state]+1);
st.insert(x);
}
}
for(auto state:st)
if(!v[state])ans = max(ans,f[state]);
printf("%lld\n",ans);
}
int main(){
t = read();
while(t--){
n = read();
lc = 1,mx = 0;
F(i,1,n)a[i] = read(),mx = max(mx,a[i]),lc = lcm(lc,a[i]);
if(lc > mx){
printf("%d\n",n);
continue;
}
solve();
}
return cerr << "Time : " << clock() << " ms" << endl, 0;
}
II CF771C Bear and Tree Jumps *2100
我们考虑对于以
这样我们找出了以一个节点为根的答案,其他节点我们可以换根求出,复杂度
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下