[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 ...
随机推荐
- 使用BlendingTexture实现简单的Terrain
[使用BlendingTexture实现简单的Terrain] BlendingTexture,就是一张纹理,纹理内存储的数据用于其它去处的Alpha通道value.例如以下四张图需要混合在Terra ...
- 网页静态化解决方案:Freemarker生成简单html页面
FreeMarker 是一个用 Java 语言编写的模板引擎,它基于模板来生成文本输出.FreeMarker与 Web 容器无关,即在 Web 运行时,它并不知道 Servlet 或 HTTP.它不仅 ...
- git的突出解决--git rebase之abort、continue、skip
(1)应用实例描述 假设在github或者gitoschina上建立了一个项目,默认分支为master分支,远程master分支上c.sh文件内容: 开发者A.B分别将项目拷贝到自己本地进行开发 某一 ...
- 快速上手Runtime(二)之给分类添加属性
我们都知道,分类是不能直接添加属性的,那么我们有时候又需要实现这个功能,那么我们应该怎么办才能为分类添加上属性呢. Runtime给分类添加属性原理 给一个类声明属性,其实本质就是给这个类添加关联,并 ...
- Python binascii
Python binascii模块 Python binascii模块 用处 包含的函数 相关内置函数 code使用示例 转载请标明出处(http://blog.csdn.net/lis_12/art ...
- SqlServer——索引
索引是根据表中一列或若干列按照一定顺序建立的列值与记录行之间的对应关系表.在数据库系统中建立索引主要有以下作用: l快速存取数据: l保证数据记录的唯一性: l实现表与表之间的参照完整性: l在使用O ...
- 花了好几个小时的奇葩Mat为0问题
问题 1. Mat mserMat = adaptive_image_from_points(contour, rect); CCharacter character; character.setCh ...
- android应用:TVlauncher源码分析之Androidmanifest.json
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="ht ...
- csv乱码
可能:iconv转码导致,本身已经是GBK,又进行了GBK转码
- 使用第三方库连接MySql数据库:PyMysql库和Pandas库
使用PyMysql库和Pandas库链接Mysql 1 系统环境 系统版本:Win10 64位 Mysql版本: 8.0.15 MySQL Community Server - GPL pymysql ...