[TJOI2007] 线段
因为每行必须走完才能到下一行,所以我们有两种决策:
1、最后留在线段左端点
2、最后留在线段右端点
这种存在状态转移且多决策的问题用动态规划来进行递推是最好不过的了。
所以我们设\(dp[i][0/1]\)来表示在第\(i\)行最后留在左/右端点的行走路径最小值。然后设\(sum[0/1][0/1]\)来表示相邻行左右端点之间的距离。(0表示左端点,1表示右端点)
然后很容易就知道状态转移的式子:
\(dp[i][0]=min(dp[i-1][0]+1+dis[0][0],dp[i-1][1]+1+dis[1][0])\)
\(dp[i][1]=min(dp[i-1][0]+1+dis[0][1],dp[i-1][1]+1+dis[1][1])\)
然后就是注意相邻两行左右端点之间的距离是存在3*2种分类讨论情况的(具体操作见代码)。
我的思路可能有点麻烦了,所以代码写的也有点长,但是自我认为超级暴力超级清楚。。。。。
以下是代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define MAXN 20010
#define int long long
using namespace std;
int n;
int dp[MAXN][2],dis[2][2],l[MAXN],r[MAXN];
//dis[0][0] left->left
//dis[0][1] left->right
//dis[1][0] right->left
//dis[1][1] right->right
int ans;
signed main()
{
scanf("%lld",&n);
for(int i=1;i<=n;i++)
scanf("%lld%lld",&l[i],&r[i]);
l[0]=r[0]=1;
l[n+1]=r[n+1]=n;
for(int i=1;i<=n+1;i++)
{
if(l[i-1]<l[i])
dis[0][0]=r[i]-l[i-1]+r[i]-l[i],dis[0][1]=r[i]-l[i-1];
else if(l[i-1]>r[i])
dis[0][0]=l[i-1]-l[i],dis[0][1]=r[i]-l[i]+l[i-1]-l[i];
else
dis[0][0]=2*r[i]-l[i-1]-l[i],dis[0][1]=l[i-1]-l[i]+r[i]-l[i];
//the last position of the point is on the left
if(r[i-1]<l[i])
dis[1][0]=r[i]-r[i-1]+r[i]-l[i],dis[1][1]=r[i]-r[i-1];
else if(r[i-1]>r[i])
dis[1][0]=r[i-1]-l[i],dis[1][1]=r[i-1]-l[i]+r[i]-l[i];
else
dis[1][0]=r[i]-r[i-1]+r[i]-l[i],dis[1][1]=r[i-1]-l[i]+r[i]-l[i];
//the last position of the point is on the right
dp[i][0]=min(dp[i-1][0]+1+dis[0][0],dp[i-1][1]+1+dis[1][0]);
dp[i][1]=min(dp[i-1][0]+1+dis[0][1],dp[i-1][1]+1+dis[1][1]);
}
printf("%lld\n",min(dp[n+1][0],dp[n+1][1])-2);
return 0;
}
[TJOI2007] 线段的更多相关文章
- luogu [TJOI2007]线段
题目链接 luogu [TJOI2007]线段 题解 dp[i][0/1]第i行在左/右端点的最短路 瞎转移 代码 #include<bits/stdc++.h> using namesp ...
- 【洛谷 P3842】[TJOI2007]线段(DP)
裸DP.感觉楼下的好复杂,我来补充一个易懂的题解. f[i][0]表示走完第i行且停在第i行的左端点最少用的步数 f[i][1]同理,停在右端点的最少步数. 那么转移就很简单了,走完当前行且停到左端点 ...
- P3842 [TJOI2007]线段
最近多刷些dp,觉得这个算不上蓝题 在一个\(n\times n\)的平面上,在每一行中有一条线段,第\(i\)行的线段的左端点是\((i, L_i)\),右端点是\((i, R_i)\),其中\ ...
- [TJOI2007] 线段 (动态规划)
题目链接 Solution 传统的线性 \(dp\) . \(f[i][0]\),\(f[i][1]\) 分别表示最后一次在 \(i\) ,然后在 左边或者右边的最小步数. 然后就每次根据上一次左边和 ...
- DP擎天
DP! 黄题: 洛谷P2101 命运石之门的选择 假装是DP(分治 + ST表) CF 982C Cut 'em all! 树形贪心 洛谷P1020 导弹拦截 单调队列水题 绿题: 洛谷P1594 护 ...
- NOIP前刷题记录
因为本蒻实在太蒻了...对于即将到来的NOIP2018ssfd,所以下决心要把自己近期做过的题目(衡量标准为洛谷蓝题难度或以上)整理一下,归归类,简单地写一下思路,就当作自己复习了吧qwq 本随笔持续 ...
- NOIP刷题
搜索 [NOIP2013]华容道 最短路+带剪枝的搜索,是一个思维难度比较大的题目. CF1064D Labyrinth 考虑贪心,用双向队列bfs [NOIP2017]宝藏 剪枝搜索出奇迹 题解:h ...
- NOIpDairy
Day 0 水水比赛 Day 1 写写Dp Part1:Dp基础练习 [HNOI2002]公交车路线 秒切,点数这么少,N这么大,目测O(N)+暴力更新 5min写完 P3842 [TJOI2007] ...
- DP百题练(一)
目录 DP百题练(一) 线性 DP 简述 Arithmetic Progressions [ZJOI2006]物流运输 LG1095 守望者的逃离 LG1103 书本整理 CH5102 移动服务 LG ...
随机推荐
- Etcd的基本使用
etcd 是 CoreOS 团队于 2013 年 6 月发起的开源项目,它的目标是构建一个高可用的分布式键值(key-value)数据库,基于 Go 语言实现,内部采用 raft 协议作为一致性算法. ...
- Python编辑器IDLE傻瓜入门
转自:http://bbs.csdn.net/topics/390451617 下载python进行安装,默认自带此工具开始->程序->Python 2.*/3.*-> IDLE ( ...
- Linux实战教学笔记40: Mha-Atlas-MySQL高可用方案实践(二)
六,配置VIP漂移 主机名 IP地址(NAT) 漂移VIP 描述 mysql-db01 eth0:192.168.0.51 VIP:192.168.0.60 系统:CentOS6.5(6.x都可以) ...
- 解决SharePoint下载文件时自动修改扩展名的问题
今天,有人告诉了我一个有趣的问题.当用户将一个扩展名为.ai的文件(Adobe illustrator格式的文件)上载到SharePoint 2013文档库中之后,点击它下载时,下载提示栏所显示的文件 ...
- jquery offset positon 获取位置不准的解决方法
问题: 本地开发时,由于使用了图片,而且使用了offset().top涉及到图片所在的div距离计算的部分,本地开发一切都没问题:但是部署到服务器上时却出现布局错乱,经过排查发现总是少了一个图片高度的 ...
- C++版修真小说
终有一天我手中的编译器将成为我灵魂的一部分,这世界在我的眼中将被代码重构,我将看到山川无尽银河无垠都汇成二进制的数字河流,过往英雄都在我脑海眼前一一浮现,而我听到无数码农跪倒在我的程序面前呼喊. 他们 ...
- 143. Reorder List(List)
Given a singly linked list L: L0→L1→…→Ln-1→Ln, reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→… You must do th ...
- 上传工程到github
这里主要讲讲如何在mac底下使用github,我刚开始使用时,还是费了一点功夫的,因为网上的资料比较杂,有些不是太准确.故将自己的安装过程比较详细的分享下,方便有需要的人,攒点人品. 首先你得完成如下 ...
- 跨版本mysqldump恢复报错Errno1449
已经有一套主从mysql,新增两个slave主库Server version: 5.6.22-log MySQL Community Server (GPL)旧从库Server version: 5. ...
- pthread_mutex_init函数与pthread_mutexattr_init函数
直接上英文解释: pthread_mutex_init()如下: NAME pthread_mutex_init, pthread_mutex_destroy - initialise or dest ...