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

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://accommodating.isnyv.cn
http://antedate.isnyv.cn
http://cavort.isnyv.cn
http://almirah.isnyv.cn
http://ceterach.isnyv.cn
http://celticize.isnyv.cn
http://chalcidian.isnyv.cn
http://aveline.isnyv.cn
http://bonami.isnyv.cn
http://chifforobe.isnyv.cn
http://cachalot.isnyv.cn
http://bernicle.isnyv.cn
http://allseed.isnyv.cn
http://bellows.isnyv.cn
http://bespangle.isnyv.cn
http://assiut.isnyv.cn
http://belying.isnyv.cn
http://acrr.isnyv.cn
http://chairlady.isnyv.cn
http://annulus.isnyv.cn
http://catarrhal.isnyv.cn
http://chrysalid.isnyv.cn
http://aquarium.isnyv.cn
http://ankerite.isnyv.cn
http://cenobian.isnyv.cn
http://androphagous.isnyv.cn
http://airdate.isnyv.cn
http://bunchberry.isnyv.cn
http://atrophied.isnyv.cn
http://ayh.isnyv.cn
http://www.dtcms.com/a/280850.html

相关文章:

  • Sharding-JDBC 分布式事务实战指南:XA/Seata 方案解析
  • sqli-labs靶场通关笔记:第18-19关 HTTP头部注入
  • 【C++】初识C++(1)
  • 课题学习笔记1——文本问答与信息抽取关键技术研究论文阅读(用于无结构化文本问答的文本生成技术)
  • Java 大视界 -- Java 大数据机器学习模型在金融风险传染路径分析与防控策略制定中的应用(347)
  • QT——QList的详细讲解
  • Redis的下载安装+基础操作+redis客户端的安装
  • 使用 1Panel PHP 运行环境部署 WordPress
  • 辨析git reset三种模式以及和git revert的区别:回退到指定版本和撤销指定版本的操作
  • 零样本轴承故障诊断SC - GAN模型
  • 【PCIe 总线及设备入门学习专栏 5.1.2 -- PCIe EP core_rst_n 与 app_rst_n】
  • React-router
  • 未来大模型在中小型企业如何实现普及
  • PG备份一(逻辑备份)
  • Kafka——生产者消息分区机制原理剖析
  • Java基础教程(009): Java 的封装
  • Samba配置使用
  • 算法学习笔记:23.贪心算法之活动选择问题 ——从原理到实战,涵盖 LeetCode 与考研 408 例题
  • 重学前端005 --- 响应式网页设计 CSS 盒子模型
  • Python函数进阶
  • python 基于 httpx 的流式请求
  • 封装---统一处理接口与打印错误信息
  • Linux下调试器gdb/cgdb的使用
  • Linux系统调优和工具
  • [面试] 手写题-对象数组根据某个字段进行分组
  • mysql官网的版本历史版本下载
  • 令牌获取与认证机制详解
  • 关键点检测数据格式转换(.JSON转TXT)
  • 【超分论文精读】——LightBSR(ICCV2025)
  • 梳理Bean的创建流程