题目链接 Turning in Homework

考虑区间DP

$f[i][j][0]$为只考虑区间$[i, j]$且最后在$a[i]$位置交作业的答案。

$f[i][j][1]$为只考虑区间$[i, j]$且最后在$a[j]$位置交作业的答案。

首先对$a[i]$升序排序(位置第一关键字,时间第二关键字)

然后就是区间DP了

$f[i][j]$可以从$f[i][j + 1]$, $f[i - 1][j]$推过来。

$f[i][j][0] = min(f[i][j][0], max(f[i][j + 1][1] + a[j + 1].fi - a[i].fi, a[i].se))$

$f[i][j][0] = min(f[i][j][0], max(f[i - 1][j][0] + a[i].fi - a[i - 1].fi, a[i].se))$

$f[i][j][1] = min(f[i][j][1], max(f[i - 1][j][0] + a[j].fi - a[i - 1].fi, a[j].se));$

$f[i][j][1] = min(f[i][j][1], max(f[i][j + 1][1] + a[j + 1].fi - a[j].fi, a[j].se));$

其中$fi$代表位置,$se$代表时间。

最后的答案为$min{min(f[i][i][0], f[i][i][1]) + abs(a[i].fi - B)}$

$B$位规定的终点。

时间复杂度$O(n^{2})$

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <functional> using namespace std; #define rep(i, a, b) for (int i(a); i <= (b); ++i)
#define dec(i, a, b) for (int i(a); i >= (b); --i)
#define MP make_pair
#define fi first
#define se second typedef long long LL; const int N = 1010;
int n, m, ed, ans;
pair <int, int> a[N];
int f[N][N][2]; int main(){ scanf("%d%d%d", &n, &m, &ed);
rep(i, 1, n) scanf("%d%d", &a[i].fi, &a[i].se);
sort(a + 1, a + n + 1); f[1][n][0] = max(a[1].fi, a[1].se);
f[1][n][1] = max(a[n].fi, a[n].se); dec(d, n - 1, 1){
rep(i, 1, n - d + 1){
int j = i + d - 1;
f[i][j][0] = 1 << 30;
if (j < n) f[i][j][0] = min(f[i][j][0], max(f[i][j + 1][1] + a[j + 1].fi - a[i].fi, a[i].se));
if (i > 1) f[i][j][0] = min(f[i][j][0], max(f[i - 1][j][0] + a[i].fi - a[i - 1].fi, a[i].se)); f[i][j][1] = 1 << 30;
if (i > 1) f[i][j][1] = min(f[i][j][1], max(f[i - 1][j][0] + a[j].fi - a[i - 1].fi, a[j].se));
if (j < n) f[i][j][1] = min(f[i][j][1], max(f[i][j + 1][1] + a[j + 1].fi - a[j].fi, a[j].se));
}
} ans = 1 << 30;
rep(i, 1, n) ans = min(ans, min(f[i][i][0], f[i][i][1]) + abs(a[i].fi - ed));
printf("%d\n", ans);
return 0;
}

POJ 1991 Turning in Homework(区间DP)的更多相关文章

  1. poj 1991 Turning in Homework dp

    这个可以证明必须从两边的任务开始交起,因为中间交的任务可以后面经过的时候再交,所以就变成了一个n*n的dp. #include <iostream> #include <cstdio ...

  2. POJ 3280 Cheapest Palindrome(区间DP求改成回文串的最小花费)

    题目链接:http://poj.org/problem?id=3280 题目大意:给你一个字符串,你可以删除或者增加任意字符,对应有相应的花费,让你通过这些操作使得字符串变为回文串,求最小花费.解题思 ...

  3. POJ 3186Treats for the Cows(区间DP)

    题目链接:http://poj.org/problem?id=3186 题目大意:给出的一系列的数字,可以看成一个双向队列,每次只能从队首或者队尾出队,第n个出队就拿这个数乘以n,最后将和加起来,求最 ...

  4. POJ 2955:Brackets(区间DP)

    http://poj.org/problem?id=2955 题意:给出一串字符,求括号匹配的数最多是多少. 思路:区间DP. 对于每个枚举的区间边界,如果两边可以配对成括号,那么dp[i][j] = ...

  5. POJ 1191 棋盘分割(区间DP)题解

    题意:中文题面 思路:不知道直接暴力枚举所有情况行不行... 我们可以把答案转化为 所以答案就是求xi2的最小值,那么我们可以直接用区间DP来写.设dp[x1][y1][x2][y2][k]为x1 y ...

  6. Poj 1651 Multiplication Puzzle(区间dp)

    Multiplication Puzzle Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10010   Accepted: ...

  7. POJ 1651 Multiplication Puzzle (区间DP,经典)

    题意: 给出一个序列,共n个正整数,要求将区间[2,n-1]全部删去,只剩下a[1]和a[n],也就是一共需要删除n-2个数字,但是每次只能删除一个数字,且会获得该数字与其旁边两个数字的积的分数,问最 ...

  8. POJ 1141 Brackets Sequence (区间DP)

    Description Let us define a regular brackets sequence in the following way: 1. Empty sequence is a r ...

  9. poj 2955 Brackets 括号匹配 区间dp

    题意:最多有多少括号匹配 思路:区间dp,模板dp,区间合并. 对于a[j]来说: 刚開始的时候,转移方程为dp[i][j]=max(dp[i][j-1],dp[i][k-1]+dp[k][j-1]+ ...

随机推荐

  1. 清北学堂2018DP&图论精讲班 DP部分学习笔记

    Day 1 上午 讲的挺基础的--不过还是有些地方不太明白 例1 给定一个数n,求将n划分成若干个正整数的方案数. 例2 数字三角形 例7 最长不下降子序列 以上太过于基础,不做深入讨论 例3 给定一 ...

  2. shell脚本,逻辑结构题练习。

    awk '/5/{a=1}!a' file2结果:1234解释:第一行 /5/不匹配跳过{a=1},继续!a,此时a没有值属于假取反为真,故输出第一行 第二行 /5/不匹配跳过{a=1},继续!a,此 ...

  3. 同时使用多个UITableView

    1.xib\storyboard中给2个tableView设置constraints(等宽) 方法 : ①设置mainTableView的上\下\左\三部分的约束为0:subTableView上\下\ ...

  4. CSS 文本下划线 text-decoration

      定义和用法 text-decoration 属性规定添加到文本的修饰. 可能的值 值 描述 none 默认.定义标准的文本. underline 定义文本下的一条线. overline 定义文本上 ...

  5. 【OS_Linux】三大文本处理工具之grep命令

    grep(global search regular expression(RE) and print out the line,整行搜索并打印匹配成功的行 语法:grep  [选项]   搜索词  ...

  6. (61)zabbix网络发现规则配置实战/详解

    开始配置.首先,我们需要定义发现规则,用于扫描.步骤如下 第一步 Configuration >>Discovery>>Create rule,编辑网络发现规则 如上配置,za ...

  7. linux中进程亲和性绑定

    什么是绑核所谓绑核,其实就是设定某个进程/线程与某个CPU核的亲和力(affinity).设定以后,Linux调度器就会让这个进程/线程只在所绑定的核上面去运行.但并不是说该进程/线程就独占这个CPU ...

  8. 八:SQL之DQL数据查询语言单表操作

    前言: DQL数据库查询语言是我们在开发中最常使用的SQL,这一章总结了单表操作部分的常用查询方式 主要操作有:查询所有字段.查询指定字段.查询指定记录.带IN的关键字查询,范围查询,陪查询.查询空值 ...

  9. MySQL-简要说明

    分类 安装发展顺序分为: 网状型数据库 层次型数据库 关系型数据库 面向对象数据库 主流:关系型数据库 关系型数据库 事务transaction: 多个操作被当作一个整体对待 • ACID:     ...

  10. PAT Basic 1058

    1058 选择题 批改多选题是比较麻烦的事情,本题就请你写个程序帮助老师批改多选题,并且指出哪道题错的人最多. 输入格式: 输入在第一行给出两个正整数 N(≤ 1000)和 M(≤ 100),分别是学 ...