The Last Puzzle ZOJ - 3541
题目链接
本题也是区间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的更多相关文章
- [ZOJ]3541 Last Puzzle (区间DP)
ZOJ 3541 题目大意:有n个按钮,第i个按钮在按下ti 时间后回自动弹起,每个开关的位置是di,问什么策略按开关可以使所有的开关同时处于按下状态 Description There is one ...
- Multiplication Puzzle ZOJ - 1602
Multiplication Puzzle ZOJ - 1602 传送门 The multiplication puzzle is played with a row of cards, each c ...
- ZOJ 3541 The Last Puzzle(经典区间dp)
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3541 题意:有一排开关,有个开关有两个值t和d,t是按下开关后在t秒后会自 ...
- ZOJ 1602 Multiplication Puzzle(区间DP)题解
题意:n个数字的串,每取出一个数字的代价为该数字和左右的乘积(1.n不能取),问最小代价 思路:dp[i][j]表示把i~j取到只剩 i.j 的最小代价. 代码: #include<set> ...
- 【转载】ACM总结——dp专辑
感谢博主—— http://blog.csdn.net/cc_again?viewmode=list ---------- Accagain 2014年5月15日 动态规划一 ...
- 【DP专辑】ACM动态规划总结
转载请注明出处,谢谢. http://blog.csdn.net/cc_again?viewmode=list ---------- Accagain 2014年5月15日 ...
- dp专题训练
****************************************************************************************** 动态规划 专题训练 ...
- 【DP专辑】ACM动态规划总结(转)
http://blog.csdn.net/cc_again/article/details/25866971 动态规划一直是ACM竞赛中的重点,同时又是难点,因为该算法时间效率高,代码量少,多元性强, ...
- dp有哪些种类
dp有哪些种类 一.总结 一句话总结: 二.dp动态规划分类详解 动态规划一直是ACM竞赛中的重点,同时又是难点,因为该算法时间效率高,代码量少,多元性强,主要考察思维能力.建模抽象能力.灵活度. * ...
随机推荐
- 如何开通linux机器的对外访问端口
1.先查看是否已经开通 2.没有开通,去linux机器查看防火墙,确实没有开通 3.修改防火墙 vim /etc/sysconfig/iptables 4.重启防火墙之后重新查看已经可以看到8000端 ...
- vue中移动端调取本地的复制的文本
_this.$vux.confirm.show({ title: '复制分享链接', content: ‘分享的内容’, onConfi ...
- 快递查询API
https://market.aliyun.com/products/56928004/cmapi014394.html#sku=yuncode839400000
- Spring - jdbcTemplate - 调试代码: PreparedStatementCreator 生成的语句, update 之后没有 自增id, 已解决
1. 概述 解决 jdbcTemplate 下, update 结果不带 自增id 的问题 2. 场景 看书 Spring in Action 5th 3.1.4 listing 3.10 saveT ...
- 【C语言】在有序数组中插入一个数,保证它依然有序
#include<stdio.h> int main() { ] = { ,,,,,, }; int key, i, j; printf("请输入一个数\n"); sc ...
- 163music 反爬分析
# 网易163 音乐的 mp3下载 .mp3 下载的一个API吧 封 IP 的一种报错 网易云就给我返回了一个{"code":-460,"msg":" ...
- blog主题——田野(1)
贮存一下,blog代码 QAQ 页首html <link rel='stylesheet' href='https://blog-static.cnblogs.com/files/elkyo/c ...
- office自签名证书
在 Office安装目录,找到 SELFCERT 文件,双击打开填写名称,生成
- ie8无法拉伸背景图
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- Truffle 快速构建 DApp
简单介绍 官网传送门 Truffle是针对基于以太坊的Solidity语言的一套开发框架.本身基于Javascript,使用以太坊虚拟机(EVM)的世界一流的开发环境,用于区块链的测试框架和资产管道 ...