http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3541

题意:
有一排开关,有个开关有两个值t和d,t是按下开关后在t秒后会自动弹起,d为距离最左端点的距离。问是否能找到一个按开关的顺序使得在某一时刻所有开关都打开。

思路:

首先要找一个最优子结构性质。

对于区间【l,r】来说,我们可以从任意一点出发,现在如果我们从中间的一点出发,那么必然要先去一个端点,然后再去另一个端点,那么在这个过程中,有些开关可能会经过多次,比如从出发点去左端点的过程中,可以打开路上的开关,但是我们还必须去右端点,那么在去右端点的路上,这些开关又会经过,此时又可以打开它,那么晚按肯定比早按来得更好,也就是说,从端点出发和从中间任意一点出发的效果是一样的,但是更省时间,这样一来,对于区间【l,r】,肯定是从端点出发的。

这样一来,用d【l】【r】【0/1】表示从左/右端点出发打开所有开关所需的最少时间。

如果从左端点出发,然后t【l】<=d【l】【r】【0/1】,那么就说明此时是无法打开区间内的所有开关的。

同时记录好路径即可。

 #include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<sstream>
#include<vector>
#include<stack>
#include<queue>
#include<cmath>
#include<map>
#include<set>
using namespace std;
typedef long long ll;
typedef long long ull;
typedef pair<int,int> pll;
const int INF = 0x3f3f3f3f;
const int maxn = + ; int n;
int t[maxn];
int d[maxn]; int dp[maxn][maxn][];
int path[maxn][maxn][]; int main()
{
//freopen("in.txt","r",stdin);
while(~scanf("%d",&n))
{
memset(dp,,sizeof(dp));
memset(path,-,sizeof(path)); for(int i=;i<=n;i++) scanf("%d",&t[i]);
for(int i=;i<=n;i++)
{
scanf("%d",&d[i]);
dp[i][i][]=dp[i][i][]=;
} for(int r=;r<=n;r++)
{
for(int i=;i+r-<=n;i++)
{
int j=i+r-;
dp[i][j][]=min(dp[i+][j][]+d[i+]-d[i],dp[i+][j][]+d[j]-d[i]);
path[i][j][]=(dp[i+][j][]+d[i+]-d[i]>=dp[i+][j][]+d[j]-d[i]);
if(dp[i][j][]>=t[i] || dp[i][j][]>INF)
dp[i][j][]=INF; dp[i][j][]=min(dp[i][j-][]+d[j]-d[i],dp[i][j-][]+d[j]-d[j-]);
path[i][j][]=(dp[i][j-][]+d[j]-d[i]>=dp[i][j-][]+d[j]-d[j-]);
if(dp[i][j][]>=t[j] || dp[i][j][]>INF)
dp[i][j][]=INF;
}
} int l=,r=n;
int next_p;
if(dp[][n][]<INF)
{
printf("");
l++;
next_p=path[][n][];
}
else if(dp[][n][]<INF)
{
printf("%d",n);
r--;
next_p=path[][n][];
}
else
{
puts("Mission Impossible");
continue;
} while(l<=r)
{
if(next_p)
{
printf(" %d",r);
next_p=path[l][r--][];
}
else
{
printf(" %d",l);
next_p=path[l++][r][];
}
}
printf("\n");
}
return ;
}

ZOJ 3541 The Last Puzzle(经典区间dp)的更多相关文章

  1. POJ 1651 Multiplication Puzzle (区间DP,经典)

    题意: 给出一个序列,共n个正整数,要求将区间[2,n-1]全部删去,只剩下a[1]和a[n],也就是一共需要删除n-2个数字,但是每次只能删除一个数字,且会获得该数字与其旁边两个数字的积的分数,问最 ...

  2. Poj 1651 Multiplication Puzzle(区间dp)

    Multiplication Puzzle Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10010   Accepted: ...

  3. 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] ...

  4. POJ 1160 经典区间dp/四边形优化

    链接http://poj.org/problem?id=1160 很好的一个题,涉及到了以前老师说过的一个题目,可惜没往那上面想. 题意,给出N个城镇的地址,他们在一条直线上,现在要选择P个城镇建立邮 ...

  5. POJ 1651:Multiplication Puzzle(区间DP)

    http://poj.org/problem?id=1651 题意:给出n个数字,每取中间一个数,就会使得权值加上中间这个数和两边的乘积,求取剩两个数最少的权值是多少. 思路:区间dp. 一开始想了挺 ...

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

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

  7. POJ 1651 Multiplication Puzzle (区间DP)

    Description The multiplication puzzle is played with a row of cards, each containing a single positi ...

  8. UVALive - 5695 The Last Puzzle (思维+区间dp)

    题目链接 题目大意:有n个按钮排成一条直线,你的任务是通过左右移动按下所有按钮,按钮如果一段时间没有被按下就会被弹开. 以下是我的推论(不一定正确): 直观地看的话,如果选择的是最优路径,那么路径的形 ...

  9. POJ1651:Multiplication Puzzle(区间dp)

    Multiplication Puzzle Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9419 Accepted: 5850 ...

随机推荐

  1. js+jquery(二)

    1.获取列表框所选中的全部选项的值 $("select").change(function() { // 设置列表框change 事件 // 获取列表框所选中的全部选项的值 ale ...

  2. 【BZOJ4144】[AMPPZ2014]Petrol 最短路+离线+最小生成树

    [BZOJ4144][AMPPZ2014]Petrol Description 给定一个n个点.m条边的带权无向图,其中有s个点是加油站. 每辆车都有一个油量上限b,即每次行走距离不能超过b,但在加油 ...

  3. Swift - 触摸事件响应机制(UiView事件传递)

    import UIKit class FatherView: UIView { override func hitTest(point: CGPoint, withEvent event: UIEve ...

  4. 借助HTML5 Blob实现文本信息文件下载

    原理其实很简单,我们可以将文本或者JS字符串信息借助Blob转换成二进制,然后,作为<a>元素的href属性,配合download属性,实现下载. 代码也比较简单,如下示意(兼容Chrom ...

  5. 使用 Visual Studio 将 ASP.NET Web 应用部署到 Azure

    原文地址:https://www.azure.cn/zh-cn/documentation/articles/web-sites-dotnet-get-started 配置新的 Web 项目 下一步是 ...

  6. formset批量处理form表单数据

    Formset(表单集)是多个表单的集合.Formset在Web开发中应用很普遍,它可以让用户在同一个页面上提交多张表单,一键添加多个数据 class StudentStudyRecordModel( ...

  7. centos7 python3 安装

    mkdir /usr/python3.5 tar -xf Python-3.5.1.tgz cd Python-3.5.1 ./configure --prefix=/usr/python3.5 ma ...

  8. Select触发事件

     案例1: <script type="text/JavaScript"> function gradeChange(){ var objS = document.ge ...

  9. wordpress的安装及使用

    1.如何查看别人的wordpress站点所有的模板 2.如何使用自定义的模板

  10. Spring笔记一

    什么是Spring spring (由rod johnson创建的一个开源框架) spring是一个开源框架,spring是于2003 年兴起的一个轻量级的java 开发框架,由rod johnson ...