UVALive - 5695 The Last Puzzle (思维+区间dp)
题目大意:有n个按钮排成一条直线,你的任务是通过左右移动按下所有按钮,按钮如果一段时间没有被按下就会被弹开。
以下是我的推论(不一定正确):
直观地看的话,如果选择的是最优路径,那么路径的形状必然是若干条区域逐渐缩小的折线,如图所示:

而不可能出现这个样子:

因为,如果这样走的话,那么中间从A到B一段反复经过的区域就全都浪费了,不如直接从C走到D划算。
进一步观察可以发现,每一个按钮只有最后一次被按下的时候是有效的,因此答案序列应当是一个从两边向中间聚合的过程。
设dp[L][R][f]表示当前在区间[L,R]的左端点(f=0)或右端点(f=1),将区间[L,R]中的所有按钮全部按下所需的最短时间,每一步只有两种选择:
1.按下当前按钮并往前走一步,以后就都不管这个按钮了,此时$dp[L][R][0]=min(dp[L][R][0],dp[L+1][R][0])+dis[L+1]-dis[L]) $(以左端点为例,右端点类似,下同。dis[i]表示i点与左端点的距离)
2.跑到对面去准备按下对面的按钮,此时$dp[L][R][0]=min(dp[L][R][0],dp[L][R][1])+dis[R]-dis[L]) $
总复杂度$O(n^2)$
吐槽:ZOJ凉了,HDU后台有问题过不了,只能交到UVAlive上了,QAQ
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=+,inf=0x3f3f3f3f;
int dp[N][N][],op[N][N][],n,t[N],dis[N];
int dfs(int L,int R,int f) {
int& ret=dp[L][R][f],&opp=op[L][R][f];
if(~ret)return ret;
if(L==R)return ret=;
ret=inf;
if(f==) {
int x=dfs(L+,R,)+dis[L+]-dis[L];
int y=dfs(L,R,)+dis[R]-dis[L];
if(x<t[L]&&x<ret)ret=x,opp=;
if(y<ret)ret=y,opp=;
} else {
int x=dfs(L,R-,)+dis[R]-dis[R-];
int y=dfs(L,R,)+dis[R]-dis[L];
if(x<t[R]&&x<ret)ret=x,opp=;
if(y<ret)ret=y,opp=;
}
return ret;
}
vector<int> ans;
void pr(int L,int R,int f) {
if(L==R) {ans.push_back(L); return;}
int opp=op[L][R][f];
if(opp==) {
if(f==)ans.push_back(L),pr(L+,R,f);
else ans.push_back(R),pr(L,R-,f);
} else pr(L,R,f^);
}
int main() {
while(scanf("%d",&n)==) {
for(int i=; i<=n; ++i)scanf("%d",&t[i]);
for(int i=; i<=n; ++i)scanf("%d",&dis[i]);
memset(dp,-,sizeof dp);
int x=dfs(,n,),y=dfs(,n,);
if(x==inf&&y==inf)puts("Mission Impossible");
else {
ans.clear();
if(x<=y)pr(,n,);
else pr(,n,);
for(int i=; i<ans.size(); ++i)printf("%d%c",ans[i]," \n"[i==ans.size()-]);
}
}
return ;
}
UVALive - 5695 The Last Puzzle (思维+区间dp)的更多相关文章
- Educational Codeforces Round 61 F 思维 + 区间dp
https://codeforces.com/contest/1132/problem/F 思维 + 区间dp 题意 给一个长度为n的字符串(<=500),每次选择消去字符,连续相同的字符可以同 ...
- Poj 1651 Multiplication Puzzle(区间dp)
Multiplication Puzzle Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10010 Accepted: ...
- POJ1651Multiplication Puzzle(区间DP)
比较好做的区间DP 状态转移方程:DP[i][j] 表示区间[i,j]最小的乘积和. DP[i][j] = MIN{DP[i][k-1]+DP[k+1][j] + a[k]*a[i-1]*a[j+1] ...
- POJ 1651 Multiplication Puzzle (区间DP,经典)
题意: 给出一个序列,共n个正整数,要求将区间[2,n-1]全部删去,只剩下a[1]和a[n],也就是一共需要删除n-2个数字,但是每次只能删除一个数字,且会获得该数字与其旁边两个数字的积的分数,问最 ...
- POJ 1651:Multiplication Puzzle(区间DP)
http://poj.org/problem?id=1651 题意:给出n个数字,每取中间一个数,就会使得权值加上中间这个数和两边的乘积,求取剩两个数最少的权值是多少. 思路:区间dp. 一开始想了挺 ...
- POJ 1651 Multiplication Puzzle (区间DP)
Description The multiplication puzzle is played with a row of cards, each containing a single positi ...
- POJ1651:Multiplication Puzzle(区间dp)
Multiplication Puzzle Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9419 Accepted: 5850 ...
- ZOJ 1602 Multiplication Puzzle(区间DP)题解
题意:n个数字的串,每取出一个数字的代价为该数字和左右的乘积(1.n不能取),问最小代价 思路:dp[i][j]表示把i~j取到只剩 i.j 的最小代价. 代码: #include<set> ...
- POJ1651 Multiplication Puzzle【区间DP】
LINK 每次删除一个数,代价是左右两边相邻的数的当前数的积 第一个和最后一个数不能删除 问最后只剩下第一个数的最后一个数的最小代价 思路 很简单的DP 正着考虑没有办法确定两边的数 那么就把每个区间 ...
随机推荐
- python 将分词结果写入txt文件
首先我运用的分词工具是结巴分词 import jieba 然后调用jieba.cut( ) 但是jieba.cut 返回的是一个generator的迭代器 他可以显示分词结果 但是无法将结果写入t ...
- ASP.NET Session详解(转)
ASP.NET Session详解 本文章来自:http://blog.163.com/adam601@126/blog/static/22506317200932824210996/ 当用户在 We ...
- 【并行计算-CUDA开发】OpenCL、OpenGL和DirectX三者的区别
什么是OpenCL? OpenCL全称Open Computing Language,是第一个面向异构系统通用目的并行编程的开放式.免费标准,也是一个统一的编程环境,便于软件开发人员为高性能计算服务器 ...
- C#追加日志文件
追加日志文件 using System; using System.IO; class DirAppend { public static void Main() { using (StreamWri ...
- inner join on会过滤掉两边空值的条件
前两天工作过程中,遇到一个问题,关于join on查询的,对于查出来的结果一直都很疑惑,这里记录一下. 1.首先看下面这条sql查询语句: 查询出来的结果是25053 2.加个 o.lat = n.l ...
- Linux动态链接之GOT与PLT
转载于:http://www.cnblogs.com/xingyun/archive/2011/12/10/2283149.html 我们知道函数名就是一个内存地址,这个地址指向函数的入口.调用函 ...
- Java 中的动态代理
一.概述 1. 什么是代理 我们大家都知道微商代理,简单地说就是代替厂家卖商品,厂家“委托”代理为其销售商品.关于微商代理,首先我们从他们那里买东西时通常不知道背后的厂家究竟是谁,也就是说,“委托者” ...
- 关闭mysql查询缓存query cache(用户测试性能)
先对query cache进行查询 mysql> show global variables like '%cache%'; 查看query_cache_size.query_cache_typ ...
- Collection接口的子接口——Deque接口
https://docs.oracle.com/javase/8/docs/api/java/util/Deque.html public interface Deque<E> exten ...
- springboot JPA mysql
官方文档 https://docs.spring.io/spring-data/jpa/docs/1.11.10.RELEASE/reference/html/ 常用关键字 通常,JPA的查询创建机制 ...