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]+ ...
随机推荐
- js获取当前日期、前一天、后一天的日期的例子
<script> function addByTransDate(dateParameter, num) { var translateDate = "", dateS ...
- 不安装oracle客户端用sqlplus连接数据库
在不安装oracle客户端情况下用sqlplus连接数据库: 1.去官网下载 http://www.oracle.com/technetwork/topics/winx64soft-089540.ht ...
- ubuntu下如何对接斗鱼直播
参考教程:https://www.cnblogs.com/liuxuzzz/p/5315998.html 大神写得挺细的,这里都不想再多说了! 为啥要做这个呢?可能真的只是为了好玩吧!!有兴趣直播的孩 ...
- 【php】运算符优先级界定
<?php $i = 1; $array[$i] = $i++; print_r($array);die; //输出 Array([2] => 1) $a = 1; echo $a + $ ...
- 【xdebug】 windows xdebug 配置
[xdebug] zend_extension = C:\phpStudy\php53n\ext\php_xdebug-2.6.1-7.0-vc14-nts-x86_64.dllxdebug.idek ...
- html块级元素和行级元素的区别和使用
行内.块状元素区别: 1.行内元素与块级函数可以相互转换,通过修改display属性值来切换块级元素和行内元素,行内元素display:inline,块级元素display:block. 2.行内元素 ...
- python中强大的testdata库自动生成测试所需要的数据
testdata是用于生成测试数据的一个安装包,它不仅提供DictFactory类来生成数据,还提供特定的扩展功能.每个Factory实例均可用于生成用户所需要的特定个数的数据,这将使我们更好地统计分 ...
- (转)iOS开发之同一应用设置不同图标和名称
本文转自:http://www.devzeng.com/blog/ios-two-version-app-setting-profile.html iOS开发之同一应用设置不同图标和名称 SEP 6T ...
- u-boot顶层Makefile分析
1.u-boot制作命令 make forlinx_nand_ram256_config: make all; 2.顶层mkconfig分析,参考 U-BOOT顶层目录mkconfig分析 mkcon ...
- shell中test的使用
#/secondin/secondfirstshecho “please enter two numseconder”read firstread secondif test $first -eq $ ...