UVA1632 Alibaba

题解:

刚开始想的时候状态转移想不到。

模模糊糊想到的是对于当前点,访问的下一个点要么是右边最近的未访问点,要么是左边的未访问点。然后就不知道了。

后来看了题解。dp[i][j][0]表示访问完[i,j]且最终在i点,1则是在j点

那么不难想到状态转移方程

dp[i][j][1]=min(dp[i][j-1][1]+val1,dp[i][j-1][0]+val2);

dp[i][j][0]=min(dp[i+1][j][1]+val3,dp[i+][j][0]+val4);

但是这样空间不够。。

就开个滚动数组。。根据区间的增长进行滚动即可.

对于滚动数组,,先写出非滚动数组。。然后在思考如何滚动即可

代码:

#include<bits/stdc++.h>
using namespace std;
#define pb push_back
#define mp make_pair
#define se second
#define fs first
#define ll long long
#define CLR(x) memset(x,0,sizeof x)
#define MC(x,y) memcpy(x,y,sizeof(x))
#define SZ(x) ((int)(x).size())
#define FOR(it,c) for(__typeof((c).begin()) it=(c).begin();it!=(c).end();it++)
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define INF 1e18
typedef pair<int,int> P;
const double eps=1e-9;
const int maxn=10010;
const int mod=10007;

ll read()
{
    ll x=0,f=1;char ch=getchar();
    while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
    while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}
    return x*f;
}
//-----------------------------------------------------------------------------

/*
    没开滚动。。判断写得有点挫。。。
    for(int k=1;k<=n-1;k++)
    {
        for(int i=1;i<=n-k;i++)
        {
            if(dp[i+1][i+k-1][0]+a[i+1]-a[i]>=b[i]) val1=INF;
            else val1=a[i+1]-a[i];
            if(dp[i+1][i+k-1][1]+a[i+k]-a[i]>=b[i]) val2=INF;
            else val2=a[i+k]-a[i];
            if(dp[i][i+k-1][1]+a[i+k]-a[i+k-1]>=b[i+k]) val3=INF;
            else val3=a[i+k]-a[i+k-1];
            if(dp[i][i+k-1][0]+a[i+k]-a[i]>=b[i+k]) val4=INF;
            else val4=a[i+k]-a[i];
            dp[i][i+k][0]=min(dp[i+1][i+k][0]+val1,dp[i+1][i+k][1]+val2);
            dp[i][i+k][1]=min(dp[i][i+k-1][1]+val3,dp[i][i+k-1][0]+val4);
            if(dp[i][i+k][0]>INF) dp[i][i+k][0]=INF;
            if(dp[i][i+k][1]>INF) dp[i][i+k][1]=INF;
        }
    }
    if(dp[1][n][0]>=INF&&dp[1][n][1]>=INF) printf("No solution\n");
    else printf("%lld\n",min(dp[1][n][0],dp[1][n][1]));

*/
//ll dp[maxn][maxn][2];
ll a[maxn],b[maxn];
ll dp[maxn][2][2];

int main()
{
    int n;
    ll val1,val2,val3,val4;
    while(~scanf("%d",&n))
    {
      CLR(dp);
      for(int i=1;i<=n;i++) scanf("%lld%lld",&a[i],&b[i]);
      int now=0,pre=1;
      for(int k=1;k<=n-1;k++)
      {
         now^=1,pre^=1;
         for(int i=1;i<=n-k;i++)
         {
            dp[i][now][0]=min(dp[i+1][pre][0]+a[i+1]-a[i],dp[i+1][pre][1]+a[i+k]-a[i]);
            dp[i][now][1]=min(dp[i][pre][1]+a[i+k]-a[i+k-1],dp[i][pre][0]+a[i+k]-a[i]);
            if(dp[i][now][0]>=b[i]) dp[i][now][0]=INF;
            if(dp[i][now][1]>=b[i+k]) dp[i][now][1]=INF;
         }
     }
      ll ans=min(dp[1][now][0],dp[1][now][1]);
      if(ans>=INF) printf("No solution\n");
      else printf("%lld\n",ans);
    }
    return 0;
}
时间: 2024-08-09 16:55:02

UVA1632 Alibaba的相关文章

UVA-1632 Alibaba (区间DP+滚动数组)

题目大意:在一条直线上有n件珠宝,已知每件珠宝的位置,并且第 i 件珠宝在 ti 时刻就消失,问能否将所有的珠宝收集起来?如果能,求出最短时间.搜集能瞬间完成. 题目分析:区间DP.dp(i,j,0)表示搜集区间(i,j)并且停留在左端所需的最短时间,dp(i,j,1)表示搜集区间(i,j)并且停留在右端所需的最短时间.状态转移方程为 dp(i,j,0)=min(dp(i+1,j,0)+t(i+1)-t(i),dp(i+1,j1,)+t(j)-t(i)),dp(i,j,1)=min(dp(i,j

com.alibaba.dubbo.rpc.RpcException: Failed to invoke the method

查看了网友们的错误原因, 需要进行实例化的类没有进行实例化,具体没有实例化的类会在错误信息中显示,在错误信息中搜索"Serializable"即可找到将其实现序列化可消除错误. 是在使用Dubbo提供服务是在主机上启动了虚拟机的网络,在Windows中具体可以,在运行中输入"CMD"在CMD窗口中输入"ifconfig"命令查看,如果有其他除本地的网络链接,通过命令或者将其手动禁止,再启动Dubbo服务可以解决问题. 防火墙对应端口没有开启 我这

java开发习惯_来自alibaba

---恢复内容开始--- [强制]POJO类中布尔类型的变量,都不要加is,否则部分框架解析会引起序列化错误.反例:定义为基本数据类型boolean isSuccess;的属性,它的方法也是isSuccess(),RPC框架在反向解析的时候,"以为"对应的属性名称是success,导致属性获取不到,进而抛出异常. [强制]包名统一使用小写,点分隔符之间有且仅有一个自然语义的英语单词.包名统一使用单数形式,但是类名如果有复数含义,类名可以使用复数形式.正例:应用工具类包名为com.ali

alibaba druid 在springboot start autoconfig 下的bug

* 背景 * 发现.分析过程 * 总结 背景 最近在使用alibaba druid进行多数据源连接的时候无意中发现一个小bug,已经提交github issue 官方已经fix.issue 地址:https://github.com/alibaba/druid/issues/1796 发现.分析过程 我们使用的java开发框架是封装好的.框架对数据源的支持是master.slave架构的,就是可以一组多从数据源,内部会自动进行主从写入.查询切换. 我们现在处于.net专java过程中,特殊场景下

使用HttpWebRequest模拟登陆阿里巴巴(alibaba、httpwebrequest、login)

前言 其实老喜欢取经,偶尔也得分享下.关于阿里巴巴国际站的登陆,过程有点复杂但是算不上难.一不小心少个东西倒也挺麻烦的. 主要是看下请求类HttpClient基本请求封装使用,AliClient模拟浏览器的操作与数据封装 这里只是简单说一下主要的类和注意点,主要步骤与注意点都写在代码注释里了.项目源码下载地址:http://git.oschina.net/GspringG/AliLogin 正文 主要类/方法 HttpClient请求模拟的基础类,也就那么个过程http header设置一下,然

alibaba fastjson常见问题FAQ

English | 中文 1. 怎么获得fastjson? 你可以通过如下地方下载fastjson: maven中央仓库: http://central.maven.org/maven2/com/alibaba/fastjson/ Sourceforge.net : https://sourceforge.net/projects/fastjson/files/ 在maven中如何配置fastjson依赖 fastjson最新版本都会发布到maven中央仓库,你可以直接依赖. <dependen

【转】Dubbo是Alibaba开源的分布式服务框架

Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合).从服务模型的角度来看,Dubbo采用的是一种非常简单的模型,要么是提供方提供服务,要么是消费方消费服务,所以基于这一点可以抽象出服务提供方(Provider)和服务消费方(Consumer)两个角色.关于注册中心.协议支持.服务监控等内容,详见后面描述. 总体架构 Dubbo的总体架构,如图所示: Dubbo框架设计一共划分了10个层,而最上面的Serv

alibaba远程调用框架dubbo原理

alibaba有好几个分布式框架,主要有:进行远程调用(类似于RMI的这种远程调用)的(dubbo.hsf),jms消息服务(napoli.notify),KV数据库(tair)等.这个框架/工具/产品在实现的时候,都考虑到了容灾,扩展,负载均衡,于是出现一个配置中心(ConfigServer)的东西来解决这些问题. 基本原理如图: 在我们的系统中,经常会有一些跨系统的调用,如在A系统中要调用B系统的一个服务,我们可能会使用RMI直接来进行,B系统发布一个RMI接口服务,然后A 系统就来通过RM

alibaba fastjson

public static void main(String[] args) { WaveSearchOutBoundNoticeDTO vo = new WaveSearchOutBoundNoticeDTO(); List<OutboundNoticeGroupSortDTO> groupSorts= new ArrayList<OutboundNoticeGroupSortDTO>(); vo.setOnhStartItemsCount(1); vo.setGroupSort