题目链接

本题也是区间dp,贪心可证,每一次出发必定是从端点,否则必然有重复,不会是最小值,那我们可以设dpi,j,0/1,0代表从左端点出发,1代表从右端点,因为每次都是从端点出发,状态方程为

dpi,j,0=min(dpi+1,j,0+d[i+1]-d[i], dpi+1,j,1+dp[j]-dp[i])分别表示from i to i+1 to j, from i to j to i+1

dpi,j,1=min(dpi,j-1,1+d[j]-d[j-1], dpi,j-1,0+dp[j]-dp[i])分别表示from j to j-1 to i, from j to i to j-1

#include<bits/stdc++.h>
using namespace std;
#define lowbit(x) ((x)&(-x))
typedef long long LL;
typedef pair<int,int> pii; const int maxn = 205;
const int INF = 0x3f3f3f3f;
int dp[maxn][maxn][2], d[maxn], t[maxn], mov[maxn][maxn][2]; void run_case() {
int n;
while(cin >> n) {
for(int i = 1; i <= n; ++i) cin >> t[i];
for(int i = 1; i <= n; ++i) cin >> d[i];
memset(dp, 0, sizeof(dp));
for(int i = n-1; i >= 1; --i) {
for(int j = i+1; j <= n; ++j) { if(dp[i+1][j][0] + d[i+1] - d[i] < dp[i+1][j][1] + d[j] - d[i]) {
dp[i][j][0] = dp[i+1][j][0] + d[i+1] - d[i];
mov[i][j][0] = 0; // from i to i+1
} else {
dp[i][j][0] = dp[i+1][j][1] + d[j] - d[i];
mov[i][j][0] = 1; // from i to j
}
if(dp[i][j][0] >= t[i]) {
dp[i][j][0] = INF;
}
// calculate dp[i][j][1]
if(dp[i][j-1][0] + d[j] - d[i] < dp[i][j-1][1] + d[j] - d[j-1]) {
dp[i][j][1] = dp[i][j-1][0] + d[j] - d[i];
mov[i][j][1] = 0; // from j to i
} else {
dp[i][j][1] = dp[i][j-1][1] + d[j] - d[j-1];
mov[i][j][1] = 1; // from j to j-1
}
if(dp[i][j][1] >= t[j]) {
dp[i][j][1] = INF;
}
}
}
int l=0, r=-1, flag;
if(dp[1][n][0] < INF) {
l = 2, r = n;
flag = mov[1][n][0];
cout << "1";
} else if(dp[1][n][1] < INF) {
l = 1, r = n-1;
flag = mov[1][n][1];
cout << n;
} else {
cout << "Mission Impossible";
}
while(l <= r) {
if(flag) {
cout << " " << r;
flag = mov[l][r][1];
r--;
} else {
cout << " " << l;
flag = mov[l][r][0];
l++;
}
}
cout << "\n";
}
} int main() {
ios::sync_with_stdio(false), cin.tie(0);
cout.flags(ios::fixed);cout.precision(10);
//int t; cin >> t;
run_case();
cout.flush();
return 0;
}

何时区间dp呢?

数据范围一定

需要维护区间状态,不同区间选择造成的影响不同,石子合并,杀狼等

The Last Puzzle ZOJ - 3541的更多相关文章

  1. [ZOJ]3541 Last Puzzle (区间DP)

    ZOJ 3541 题目大意:有n个按钮,第i个按钮在按下ti 时间后回自动弹起,每个开关的位置是di,问什么策略按开关可以使所有的开关同时处于按下状态 Description There is one ...

  2. Multiplication Puzzle ZOJ - 1602

    Multiplication Puzzle ZOJ - 1602 传送门 The multiplication puzzle is played with a row of cards, each c ...

  3. ZOJ 3541 The Last Puzzle(经典区间dp)

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3541 题意:有一排开关,有个开关有两个值t和d,t是按下开关后在t秒后会自 ...

  4. ZOJ 1602 Multiplication Puzzle(区间DP)题解

    题意:n个数字的串,每取出一个数字的代价为该数字和左右的乘积(1.n不能取),问最小代价 思路:dp[i][j]表示把i~j取到只剩 i.j 的最小代价. 代码: #include<set> ...

  5. 【转载】ACM总结——dp专辑

    感谢博主——      http://blog.csdn.net/cc_again?viewmode=list       ----------  Accagain  2014年5月15日 动态规划一 ...

  6. 【DP专辑】ACM动态规划总结

    转载请注明出处,谢谢.   http://blog.csdn.net/cc_again?viewmode=list          ----------  Accagain  2014年5月15日 ...

  7. dp专题训练

    ****************************************************************************************** 动态规划 专题训练 ...

  8. 【DP专辑】ACM动态规划总结(转)

    http://blog.csdn.net/cc_again/article/details/25866971 动态规划一直是ACM竞赛中的重点,同时又是难点,因为该算法时间效率高,代码量少,多元性强, ...

  9. dp有哪些种类

    dp有哪些种类 一.总结 一句话总结: 二.dp动态规划分类详解 动态规划一直是ACM竞赛中的重点,同时又是难点,因为该算法时间效率高,代码量少,多元性强,主要考察思维能力.建模抽象能力.灵活度. * ...

随机推荐

  1. Shell脚本命令汇总中

    一.换行 echo -e 可以通过\n编译换行 echo -n不换行,如果加入了\n,则会打出“\n”字符 #!/bin/bash echo -e "O\nK\n!" echo & ...

  2. [Python] CondaHTTPError: HTTP 000 CONNECTION FAILED for url

    CondaHTTPError: HTTP 000 CONNECTION FAILED for url 遇到这个问题 解决方法如下两个 一.C:\Users\Administrator 目录下 编辑 . ...

  3. 吴裕雄 python 机器学习——集成学习梯度提升决策树GradientBoostingRegressor回归模型

    import numpy as np import matplotlib.pyplot as plt from sklearn import datasets,ensemble from sklear ...

  4. Ubuntu系统备份还原教程

    一.备份 很多人有备份系统的习惯,以防系统挂.Windows下可以用DISM创建一个系统镜像,在Ubuntu下,我们可以使用squashfs-tools创建系统镜像. 准备工作 可启动LiveCD一份 ...

  5. linux shell 正则表达式详解

    正则 1. 普通正则表达式 2. 扩展正则表达式 普通正则表达式 . 任意一个字符 * 前面一个字符出现0次或者多次 [abc] 中括号内任意一个字符 [^abc] 非括号内任意一个字符 [0-9] ...

  6. mysql 慢查询日志 (mysqldumpslow坑还没填)

    MySQL的慢查询日志是MySQL提供的一种日志记录,用来记录在MySQL中响应时间超过long_query_time值的SQL语句(秒为单位). 默认情况下MySql数据库没有开启慢查询日志, my ...

  7. VMware下Linux虚拟机访问本地Win共享文件夹

    VMware下Linux虚拟机访问本地Win共享文件夹 : 访问共享文件夹的步骤如下: 1.先在本地Win创建一个需要共享到虚拟机中的共享目录,如  F:\share. 2.打开你的VMware,选择 ...

  8. LR编写webservice协议接口

    转自:http://lovesoo.org/use-loadrunner-call-webservice-interface-testing-optimization-summary.html 本文主 ...

  9. 2019年小结&2020年展望

    每篇一句 If you want love, then this is it. This is real life. It's not perfect but it's real. --Before ...

  10. 安装Linux系统后配置的一般步骤

    安装linux后配置的一般步骤 最近在尝试不同的linux系统,记录一下安装完linux之后常用的软件的安装方法 1.源的更新 ubuntu 源的更新方法 参考(没有测试过,但是都大同小异,不行就换一 ...