【Copy自某谷题解】【[TJOI2007]线段】

裸DP。感觉楼下的好复杂,我来补充一个易懂的题解。

f[i][0]表示走完第i行且停在第i行的左端点最少用的步数

f[i][1]同理,停在右端点的最少步数。

那么转移就很简单了,走完当前行且停到左端点,那么一定是从右端点过来的,那么从上一行左端点转移的话就是

f[i][0]=abs(上一行左端点的坐标-本行右端点的坐标+本行线段长度)

从上一行右端点转移同理。
不需要什么判断。边界f[1][0]=r[1]+r[1]-l[1]-1,f[1][1]=r[1]-1,然后直接搞就行了,时间复杂度O(n)。

#include <iostream>
#include <cstdio>
#define rep(i,m,n) for(int i=m;i<=n;++i)
using namespace std;
inline int read(){
    int s = 0, w = 1;
    char ch = getchar();
    while(ch < '0' || ch > '9'){if(ch == '-')w = -1;ch = getchar();}
    while(ch >= '0' && ch <= '9') s = s * 10 + ch - '0',ch = getchar();
    return s * w;
}
const int MAXN = 20010;
int n;
int l[MAXN], r[MAXN], f[MAXN][2];
int main(){
    n = read();
    rep(i, 1, n) l[i] = read(), r[i] = read();
    f[1][0] = r[1] + r[1] - l[1] - 1;
    f[1][1] = r[1] - 1;
    rep(i, 2, n)
       f[i][0] = min(f[i-1][0] + abs(l[i-1] - r[i]) + r[i] - l[i] + 1, f[i-1][1] + abs(r[i-1] - r[i]) + r[i] - l[i] + 1),
       f[i][1] = min(f[i-1][0] + abs(l[i-1] - l[i]) + r[i] - l[i] + 1, f[i-1][1] + abs(r[i-1] - l[i]) + r[i] - l[i] + 1);
    printf("%d\n", min(f[n][0] + n - l[n], f[n][1] + n - r[n]));
    //rep(i, 1, n){ rep(j, 0, 1) printf("f[%d][%d] = %d, ", i, j, f[i][j]); puts(""); }
    return 0;
}

原文地址:https://www.cnblogs.com/Qihoo360/p/9468329.html

时间: 2024-10-09 15:05:33

【Copy自某谷题解】【[TJOI2007]线段】的相关文章

【Copy自某谷题解】P1445 【[Violet]樱花】

做了题还是忍不住要写一发题解,感觉楼下的不易懂啊. 本题解使用latex纯手写精心打造. 题意:求\(\frac{1}{x}+\frac{1}{y}=\frac{1}{n!}\)的正整数解总数. 首先,不会线筛素数的先去做下LuoguP3383. 开始推导. \[\frac{1}{x}+\frac{1}{y}=\frac{1}{n!}\] 那么\(\frac{1}{x}\)和\(\frac{1}{y}\)肯定是小于\(\frac{1}{n!}\)的.所以\(x\)和\(y\)肯定都是大于\(n!

【Copy自某谷题解】P1364 【医院设置】

现有的题解基本是用Floyed或者其他稍优的算法跑的,其时间复杂度均在\(O(n^2)\)以上. 那么问题来了, 你们经历过绝望吗 这题作为我们图论考试的一道题,n的范围直接到了10000,此时N^2的算法也无法AC. 有句写居里夫人的话:"别人摸瓜她寻藤,别人摘叶他问根" 我们也要做那个"她", 不能只满足于通过此题,而且要了解本题的\(O(N)\)算法正解:带权树的重心. 树的重心的定义: 树若以某点为根,使得该树最大子树的结点数最小,那么这个点则为该树的重心,

【Copy自某谷题解,有删改】P2346 【四子连棋】

其实这题可以直接二进制状压做,1表示黑棋,0表示白棋,另外记录下2个空点的位置就行了. 具体看代码(冗长): #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <queue> #include <set> #include <map> #include &

【Copy自某谷题解】UVA11417 【GCD】

四倍经验 UVA11417 P2568 P2398 UVA11426 反演是不可能反演的这辈子不可能反演的 我们枚举所有gcd \(k\),求所有\(gcd=k\)的数对,记作\(f(k)\),那么\(ans=\sum_{i=1}^{n}(f(i)-1)*i\).为什么减1呢,观察题目,发现\(j=i+1\),所以自己与自己的数对是不算的. \(f(k)\)怎么求? 若\(a,b\)互质,则\(gcd(ak,bk)=k\). 我们枚举\(a,b\)中较大的那个,记作\(i\),那么另一个数就有\

P2023 [AHOI2009]维护序列 题解(线段树

题目链接 P2023 [AHOI2009]维护序列 解题思路 线段树板子.不难,但是...有坑.坑有多深?一页\(WA\). 由于乘法可能乘\(k=0\),我这种做法可能会使结果产生负数.于是就有了这篇题解. (详情见代码注释) AC代码 #include<stdio.h> #define min(a,b) (a>b?b:a) #define max(a,b) (a>b?a:b) typedef long long ll; int n,m; ll mod,k,a[500010];

洛谷P3847 [TJOI2007]调整队形

P3847 [TJOI2007]调整队形 题目背景 学校艺术节上,规定合唱队要参加比赛,各个队员的衣服颜色不能很混乱:合唱队员应排成一横排,且衣服颜色必须是左右对称的. 例如:“红蓝绿蓝红”或“红蓝绿绿蓝红”都是符合的,而“红蓝绿红”或“蓝绿蓝红”就不符合要求. 合唱队人数自然很多,仅现有的同学就可能会有3000个.老师希望将合唱队调整得符合要求,但想要调整尽量少,减少麻烦.以下任一动作认为是一次调整: 题目描述 1.在队伍左或右边加一个人(衣服颜色依要求而定): 2.在队伍中任两个人中间插入一

【伪题解】线段树什么最讨厌了 (DFS)

Description: 小丫最近学习了线段树,但是由于她的智商比较低,运用的还不是很熟练.于是小R给了她一点练习题训练,其中有一道是这样的.这是小R写的线段树的一段建树代码: 只要调用buildtree(1,0,n)就可以得到一颗线段树了.显然,一颗线段树一共有O(n)个节点,因为每一个节点都代表了一个不同的区间,所以线段树上一共出现了O(n)个不同的区间.现在小R给了你一个区间[l ;r ] ,想要你告诉他一个最小的n使得区间[l ;]出现在了用buildtree(1,0n)建出来的线段树中

【洛谷题解】P2303 [SDOi2012]Longge的问题

题目传送门:链接. 能自己推出正确的式子的感觉真的很好! 题意简述: 求\(\sum_{i=1}^{n}gcd(i,n)\).\(n\leq 2^{32}\). 题解: 我们开始化简式子: \(\sum_{i=1}^{n}gcd(i,n)\) \(=\sum_{j=1}^{n}\left(j\times\sum_{i=1}^{n}\left[gcd(i,n)=j\right]\right)\) \(=\sum_{j=1}^{n}\left(j\times\sum_{i=1}^{n}\left[g

我的洛谷题解

2018.2.4 P1217[USACO1.5]回文质数 Prime Palindromes] 2018.2.6  P1308 [统计单词数] 链接 持续更新中 原文地址:https://www.cnblogs.com/SocietyNiu/p/8425725.html