当前位置: 首页 > web >正文

P3842 [TJOI2007] 线段

 

提供的代码使用动态规划来解决这个问题:

  1. ​数据结构​​:

    • a[]数组存储每行线段的左右端点

    • dp[]数组存储到达每行左右端点的最小路径长度

  2. ​核心函数sth()​:

    • 计算从上一行的某个位置到当前行某个位置的路径长度

    • pan参数决定是从左到右还是从右到左遍历当前行

  3. ​动态规划转移​​:

    • 对于每一行,计算从左端点和右端点出发的最短路径

    • 考虑两种遍历方式(从左到右或从右到左)

    • 使用min()函数选择更优的路径

  4. ​初始条件和边界处理​​:

    • 第一行的处理是特殊情况

    • 最后需要从最后一行到达(n,n)

算法优化建议

  1. ​空间优化​​:当前代码使用了O(n)的空间,可以进一步优化为只保存前一行的状态。

  2. ​预处理​​:可以预先计算某些重复使用的值,减少重复计算。

  3. ​更清晰的逻辑​​:可以将路径计算部分拆分为更小的函数,提高代码可读性。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<iostream>
#include<bits/stdc++.h>
#define ll long long 
using namespace std;
struct {int l, r;
}a[20004], dp[20004];
int n;
ll sum = 0;
ll sth(int i, int k,bool pan) {if (pan == false) {if (k >= a[i].r) {return k - a[i].l + 1;}else if(k<=a[i].l) {return a[i].r - k + (a[i].r - a[i].l) + 1;}else {return (a[i].r - k) + a[i].r - a[i].l + 1;}}else {if (k >= a[i].r) {return (k - a[i].l) + (a[i].r - a[i].l) + 1;}else if (k <= a[i].l) {return a[i].r - k + 1;}else {return ( k- a[i].l) + a[i].r - a[i].l + 1;}}
}
int main(){ios::sync_with_stdio(false);        // 禁用同步cin.tie(nullptr);                   // 解除cin与cout绑定cin >> n;for (int i = 0; i < n; i++) {cin >> a[i].l >> a[i].r;}for (int i = 0; i < n; i++) {if (i == 0){dp[i].l = (a[i].r - 1) + (a[i].r - a[i].l);dp[i].r = a[i].r - 1;}else {dp[i].l = min((sth(i, a[i - 1].l, false) + dp[i - 1].l), (sth(i, a[i - 1].r, false) + dp[i - 1].r));dp[i].r = min((sth(i, a[i - 1].l, true) + dp[i - 1].l), (sth(i, a[i - 1].r, true) + dp[i - 1].r));}}cout << min(n - a[n - 1].l + dp[n - 1].l, n - a[n - 1].r + dp[n - 1].r);return 0;
}

http://www.xdnf.cn/news/15587.html

相关文章:

  • Web攻防-PHP反序列化字符逃逸增多减少成员变量属性解析不敏感Wakeup绕过
  • 高等数学强化——导学
  • Android中Launcher简介
  • deepseekAI对接大模型的网页PHP源码带管理后台(可实现上传分析文件)
  • ASP .NET Core 8结合JWT轻松实现身份验证和授权
  • SpringBoot 实现 Redis读写分离
  • “C21988-谷物烘干机(2D+3D+说明书+运动仿真)8张cad+设计说明书
  • pytorch学习笔记(四)-- TorchVision 物体检测微调教程
  • 常用高频指令总结
  • iOS App 上架工具选型与跨平台开发 iOS 上架流程优化实录
  • 视频HDR技术全解析:从原理到应用的深度探索
  • 【时时三省】(C语言基础)通过指针引用多维数组
  • 视频编码中熵编码之基于上下文的变长编码(Huffman霍夫曼编码和指数哥伦布)
  • 网络编程-epoll模型/udp通信
  • css 边框颜色渐变
  • 【linux V0.11】init/main.c
  • JAVA青企码协会模式系统源码支持微信公众号+微信小程序+H5+APP
  • Spring MVC 执行流程详解:一次请求经历了什么?
  • 基于铸造机床的Canopen转Profinet协议转换网关应用研究
  • 涨停板池,跌停板池,炸板池,次新股池,强势股池数据接口
  • Python命令行计算2的22次方方法
  • 轻松管理多个Go版本:g工具安装与使用
  • keeplived双击热备配置
  • Spring Security 实践及源码学习
  • 如何轻松将音乐从安卓设备传输到安卓设备
  • 504网关超时可能是哪些原因导致?
  • 短剧小程序的「技术革命」:从「粗放生长」到「精准运营」
  • Docker镜像导入、导出操作指南
  • 工业喷涂机器人的革新:艾利特协作机器人引领人机交互新纪元
  • Zookeeper入门安装与使用详解