cf1625 C. Road Optimization(dp)
2022/1/24 6:06:08
本文主要是介绍cf1625 C. Road Optimization(dp),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
题意:
一段长为 \(l\) 的线段上,给定 \(n\) 个限速标志。第 \(i\) 个标志的值为 \(a_i\),位置为 \(s_i\),表示由此标志走到下一标志需要时间 \(a_i(s_{i+1}-s_i)\)。第一个标志在起点 \(0\) 处,且必须选择。
现去掉不超过 \(k\) 个标志,求走完全程的最短时间。
输入均为整数,\(n\le 500\)
思路:
\(f[i][j]\) 表示走到第 \(i\) 个标志,已经选了 \(j\) 个标志且选择第 \(i\) 个标志的最短时间。
枚举 \(i\) 的前面最后一个被选的标志 \(las\),则 \(f[i][j]=min\{f[las][j-1]+a_{las}(s_i-s_{las})\}\),即从 \(las\) 到 \(i\) 这段路都用 \(a_{las}\) 来走。
把终点加上:s[++n]=l
,最后答案为必选终点且已选 \([n-k, n]\) 个点的最短时间。
const int N = 510; int n, l, k, s[N], a[N], f[N][N]; signed main() { cin >> n >> l >> k; for(int i = 1; i <= n; i++) cin >> s[i]; for(int i = 1; i <= n; i++) cin >> a[i]; s[++n] = l; memset(f, INF, sizeof f); f[1][1] = 0; for(int i = 2; i <= n; i++) for(int j = 1; j <= i; j++) //至少已选1个 for(int las = 1; las < i; las++) f[i][j] = min(f[i][j], f[las][j-1] + a[las] * (s[i]-s[las])); int ans = INF; for(int i = n - k; i <= n; i++) ans = min(ans, f[n][i]); cout << ans << endl; return 0; }
这篇关于cf1625 C. Road Optimization(dp)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-07-03微信支付提示下单账户与支付账户不一致-icode9专业技术文章分享
- 2024-07-03微信支付提示订单号重复-icode9专业技术文章分享
- 2024-07-02微服务启动nacos注册上去了,但是一直没有收到请求-icode9专业技术文章分享
- 2024-07-02如何检查文件的编码格式-icode9专业技术文章分享
- 2024-07-02sublime 更改编码格式-icode9专业技术文章分享
- 2024-06-30uniAPP 实现全屏左右滚动滚动的效果-icode9专业技术文章分享
- 2024-06-30如何在本地使用授权或插件-icode9专业技术文章分享
- 2024-06-30伪静态规则配置方法汇总-icode9专业技术文章分享
- 2024-06-29易优CMS安装常见问题汇总-icode9专业技术文章分享
- 2024-06-28易优新手必读安装教程-icode9专业技术文章分享