Processing math: 5%

[正经向] 九月杂题整理

  • \rm{LG1858} 多人背包

挺新颖的DP虽然是很早的题了

设计状态f_{i,v,k}表示考虑前i个物品,现在装了v,排名k的解。我们考虑这个解一定是可以从f_{i-1,v,1\to K}或者f_{i-1,v-cost_i,1\to K}+val_i转移过来的,并且随着k递增,f递减,所以转移的时候就可以从两个状态集各拉一个指针过来,单调转移一下即可。

	for (i = 0 ; i < M ; ++ i)
			for (j = 1 ; j <= K ; ++ j)
					f[i][j] = - Inf ; f[0][1] = 0 ; 
	for (i = 1 ; i <= N ; ++ i)
			for (j = M ; j >= c[i] ; -- j){
					int H1 = 0, H2 = 0 ;  
					if (f[j - c[i]][1] < 0) continue ; 
					tmp[1] = f[j][1] ; 
					for (k = 1 ; k <= K ; ++ k, tmp[k] = f[j][k]){
							if (f[j - c[i]][H1 + 1] + v[i] > tmp[H2 + 1]) 
								H1 ++, f[j][k] = max(f[j][k], f[j - c[i]][H1] + v[i]) ;
		 					 else H2 ++, f[j][k] = max(f[j][k], tmp[H2]) ; 
						}
				}
	for (i = 1 ; i <= K ; ++ i) ans += f[M][i] ;
  • \rm{LG4641} 序列

以前写过详细的:Link

  • \rm{LG3071} 座位

很简单的线段树,就是“所maintain非所query”这个技巧还是可以学一下的。简单记一下比较妙的query函数吧:

int query(int rt, int l, int r){
	down(rt) ; 
	if (l == r) return l ; 
	int ls = rt << 1, rs = rt << 1 | 1, mid = (l + r) >> 1 ; 
	if (T[ls].S >= O) return query(ls, l, mid) ; 
	else if (T[ls].Rs + T[rs].Ls >= O) return mid - T[ls].Rs + 1 ; 
	return query(rs, mid + 1, r) ; 
}
  • \rm{LG1005} 矩阵取数

f_{l,r}表示只剩[l,r]之间没取的最大值,n^2之后统计每个f_{i,i}算贡献,挺水的一dp。

posted @   皎月半洒花  阅读(128)  评论(0编辑  收藏  举报
编辑推荐:
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
· Linux系统下SQL Server数据库镜像配置全流程详解
阅读排行:
· Sdcb Chats 技术博客:数据库 ID 选型的曲折之路 - 从 Guid 到自增 ID,再到
· 语音处理 开源项目 EchoSharp
· 《HelloGitHub》第 106 期
· mysql8.0无备份通过idb文件恢复数据过程、idb文件修复和tablespace id不一致处
· 使用 Dify + LLM 构建精确任务处理应用
点击右上角即可分享
微信分享提示