洛谷带刷100题(T16-T20)
2025.03.20
T26 合并序列
题目简介:简单的字符串模拟
思路:
遍历每一个字符串判断s.find(t)==0,则t是s的前缀
注意点:
1.对vector
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]);