洛谷带刷100题(T26-T30)

洛谷带刷100题(T16-T20)

2025.03.20

T26 合并序列

题目简介:简单的字符串模拟

思路:

遍历每一个字符串判断s.find(t)==0,则t是s的前缀

注意点:

1.对vector的容器用sort是默认按照字典序排序


T27 约数研究

题目简介:数学题,先思考转化,再应用埃氏筛

注意点:

1.此题重在如何想到用埃氏筛,将每个数的约数和问题转化为各个约数的和,比较拗口

如果忘了就翻出来题和代码看一眼


T28 跳马问题

题目简介:类似过河卒的动态规划

注意点:

1.踩坑了,此题循环行和列有区别,要考虑实际dp数组的推导,应把列放在外层循环,卡了好一会

2.还是dx[4],dy[4]数组控制方向,再进行边界判断

其他就没什么特殊的了


T29 最大子树和

题目简介:树形dp,还有贪心和深度搜索的思想,第一次做!

注意点:

1.对于图的存储

vector<int>g[N];
for(int i = 1;i<n;i++){
	int x,y;cin>>x>>y;
	g[x].push_back(y),g[y].push_back(x);
	}

区分是有向图还是无向图,无向图需要分别将对方初始化

2.树的深搜加贪心

void dfs(int x,int fa){
	dp[x]=w[x];
	for(const auto&y:g[x]){
		if(y==fa)continue;
		dfs(y,x);
		if(dp[y]>0)dp[x]+=dp[y];
	}
}
if(y==fa)continue

这一步是保证树往下搜,防止死循环

3.主程序中ans初始化为dp数组的任意一项均可,而不要初始化为0,因为答案可能存在负数

	int ans = dp[1];

T30 精卫填海

题目简介:非常规背包,装到价值为W所需的最小V,而不是容量为V的最大W

注意点:

1.递推过程如下,一维背包的写法再回顾一下

	for(int i = 1;i<=n;i++){
		for(int j = 2e4;j>=V[i];j--){
			dp[j]=min(dp[j],dp[j-V[i]]+W[i]);
		}
	}

2.答案要遍历所有的dp寻找,可能存在石头体积很大,容量很小的极端情况

	for(int i = v;i<=2e4;i++) ans=min(ans,dp[i]);
posted @ 2025-03-20 20:37  Fllipped  阅读(56)  评论(0)    收藏  举报