洛谷P1052过河
不看数据范围的话是一个很简单的DP,可是加上数据范围之后就之前的做法就不行了。
所以我们考虑一下路径压缩。
小数据Code
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int l, m, s, t, dp[100010];
int flag[100010];
int main()
{
scanf("%d%d%d%d", &l, &s, &t, &m);
for (int i = 1; i <= m; i++)
{
int a;
scanf("%d", &a);
flag[a] = 1;
}
for (int i = 1; i <= l; i++)
{
dp[i] = 21474836;
for (int j = max(i - t, 0); j <= i - s; j++)
dp[i] = min(dp[i], dp[j] + flag[i]);
}
printf("%d", dp[l]);
}
大数据Code
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#define ha s * t
#define N 100111
#define inf 214748364
#define int long long
using namespace std;
int l, m, s, t, dp[N], ans = inf * 10, r;
int data[N], a[N], b[N];
inline void init()
{
scanf("%lld%lld%lld%lld", &l, &s, &t, &m);
for (int i = 1; i <= m; i++)
cin >> data[i];
sort(data + 1, data + 1 + m);
if (s == t)
{
int ans = 0;
for (int i = 1; i <= m; i++)
if (!(data[i] % s)) ans++;
printf("%lld", ans);
exit(0);
}
for (int i = 1; i <= m; i++)
{
int cha = data[i] - data[i - 1];
if (cha >= ha) cha = ha;
a[i] = a[i - 1] + cha;
b[a[i]] = 1;
}
r = a[m] + ha;
for (int i = 1; i <= r; i++)
dp[i] = inf;
}
signed main()
{
init();
for (int i = 1; i <= r; i++)
for (int j = s; j <= t; j++)
{
if (i >= j)
{
if (b[i]) dp[i] = min(dp[i - j] + 1, dp[i]);//如果该数已被标记,就要加1
else dp[i] = min(dp[i - j], dp[i]);
}
}
for (int i = a[m]; i <= r; i++)
ans = min(ans, dp[i]);
printf("%lld", ans);//输出最小值。
return 0;
}
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ThreeJs-16智慧城市项目(重磅以及未来发展ai)
· .NET 原生驾驭 AI 新基建实战系列(一):向量数据库的应用与畅想
· Browser-use 详细介绍&使用文档
· 软件产品开发中常见的10个问题及处理方法
· Vite CVE-2025-30208 安全漏洞
2018-06-03 线段树