POJ 1991 Turning in Homework(区间DP)
题目链接 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)的更多相关文章
- poj 1991 Turning in Homework dp
这个可以证明必须从两边的任务开始交起,因为中间交的任务可以后面经过的时候再交,所以就变成了一个n*n的dp. #include <iostream> #include <cstdio ...
- POJ 3280 Cheapest Palindrome(区间DP求改成回文串的最小花费)
题目链接:http://poj.org/problem?id=3280 题目大意:给你一个字符串,你可以删除或者增加任意字符,对应有相应的花费,让你通过这些操作使得字符串变为回文串,求最小花费.解题思 ...
- POJ 3186Treats for the Cows(区间DP)
题目链接:http://poj.org/problem?id=3186 题目大意:给出的一系列的数字,可以看成一个双向队列,每次只能从队首或者队尾出队,第n个出队就拿这个数乘以n,最后将和加起来,求最 ...
- POJ 2955:Brackets(区间DP)
http://poj.org/problem?id=2955 题意:给出一串字符,求括号匹配的数最多是多少. 思路:区间DP. 对于每个枚举的区间边界,如果两边可以配对成括号,那么dp[i][j] = ...
- POJ 1191 棋盘分割(区间DP)题解
题意:中文题面 思路:不知道直接暴力枚举所有情况行不行... 我们可以把答案转化为 所以答案就是求xi2的最小值,那么我们可以直接用区间DP来写.设dp[x1][y1][x2][y2][k]为x1 y ...
- Poj 1651 Multiplication Puzzle(区间dp)
Multiplication Puzzle Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10010 Accepted: ...
- POJ 1651 Multiplication Puzzle (区间DP,经典)
题意: 给出一个序列,共n个正整数,要求将区间[2,n-1]全部删去,只剩下a[1]和a[n],也就是一共需要删除n-2个数字,但是每次只能删除一个数字,且会获得该数字与其旁边两个数字的积的分数,问最 ...
- POJ 1141 Brackets Sequence (区间DP)
Description Let us define a regular brackets sequence in the following way: 1. Empty sequence is a r ...
- poj 2955 Brackets 括号匹配 区间dp
题意:最多有多少括号匹配 思路:区间dp,模板dp,区间合并. 对于a[j]来说: 刚開始的时候,转移方程为dp[i][j]=max(dp[i][j-1],dp[i][k-1]+dp[k][j-1]+ ...
随机推荐
- C-基础:表达式中存在有符号类型和无符号类型时,都自动转换为无符号类型
void foo(void) { unsigned ; ; (a+b > ) puts("> 6") : puts("<= 6"); } 答案 ...
- Mac OSX用 dd 命令,浇灌ISO镜像到USB驱动器
Mac OSX用 dd 命令,浇灌ISO镜像到USB驱动器 字数244 阅读197 评论0 喜欢0 把ISO镜像转换为一个可启动的USB设备.一种可行的方法是通过OS X的Terminal “浇灌”到 ...
- Java多线程大合集
1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速.比如,如果一个线程完成 ...
- The Three Day
函数基础-练习 #.写函数,,用户传入修改的文件名,与要修改的内容,执行函数,完成批了修改操作 # def modify_file(filename,old,new): # import os # w ...
- Objective-C urlEncode urlDecode
@interface NSString (stringByDecodingURLFormat) - (NSString *)stringByDecodingURLFormat; - (NSString ...
- Hi3519V101 SDK安装以及开发环境搭建
Hi3519V101 Linux开发环境 1.安装Hi3519V101 SDKHi3519V101 SDK是基于Hi3519V101 DMEB的软件开发包,包含了在Linux相关应用开发时使用的各种工 ...
- Knockout v3.4.0 中文版教程-8-计算监控-纯计算属性
4.纯计算属性 纯计算监控在KO 3.2.0中开始引入,比大多数应用程序使计算监控有更大的性能提升和内存优化.这是因为在自身没有订阅的时候不会保持订阅状态.特性如下 阻止内存泄露 - 避免在应用程序里 ...
- luogu3834 【模板】可持久化线段树 1(主席树)
关于空间,第零棵树是 \(4n\),其后每棵树都要多来 \(\log(n)\) 的空间,所以我是开 \(n(4+\log(n))\) 的空间. 关于借用节点: 图片来自这里 #include < ...
- x86保护模式 二 分段管理机制
分段管理机制 段选择子和偏移地址的二维虚拟地址转换为一维的线性地址 一 段定义和虚拟地址到线性地址的转换 三个参数定义段:段基地址 段界限 和段属性 同时也是段描述符的结构 段基地址为 ...
- 1.ruby基本格式
1.ruby对于空格是敏感的,很像shell 如:a + b 解释成 a+b(这是两个局部变量) a +b 解释成 a(+b) (这是一个方法调用) 2.在ruby中一行怎么才算结束? Ruby解释分 ...