• #dp#JZOJ 1281 旅行


    BDBqxS.png


    分析

    考虑每次都是取出一个连续段置换一下,
    可以预处理出相邻差的绝对值的前缀和,
    但是如果正序无法知道上一段是从哪个终止的
    所以倒序就可以了


    代码

    #include <cstdio>
    #include <cctype>
    #include <bitset>
    #define rr register
    using namespace std;
    const int N=2011; typedef long long lll;
    int a[N],n; lll dp[N][2],s[N];
    inline signed iut(){
    	rr int ans=0; rr char c=getchar();
    	while (!isdigit(c)) c=getchar();
    	while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
    	return ans;
    }
    inline lll min(lll a,lll b){return a<b?a:b;}
    inline signed Abs(int x){return x<0?-x:x;}
    signed main(){
    	n=iut(); for (rr int i=1;i<=n;++i) a[i]=iut();
    	for (rr int i=2;i<=n;++i) s[i]=s[i-1]+Abs(a[i]-a[i-1]);
    	dp[n-1][0]=dp[n-1][1]=Abs(a[n]-a[n-1]);
    	for (rr int i=n-2;i;--i){
    		dp[i][0]=min(dp[i+1][0]+Abs(a[i+1]-a[i]),dp[i+1][1]+Abs(a[i+2]-a[i]));
    		dp[i][1]=min(s[n-1]-s[i+1]+Abs(a[n-1]-a[i])+Abs(a[n]-a[i]),s[n]-s[i+1]+Abs(a[n]-a[i]));
    		for (rr int j=i+1;j<n-1;++j)
    		    dp[i][1]=min(dp[i][1],min(dp[j+1][0]+Abs(a[j+1]-a[i]),dp[j+1][1]+Abs(a[j+2]-a[i]))+s[j]-s[i+1]+Abs(a[j]-a[i]));
    	}
    	return !printf("%lld",min(dp[1][0],dp[1][1]));
    } 
    
  • 相关阅读:
    如何打日志才能方便排查问题?
    为什么 HashMap 并发时会引起死循环?
    Spring 为什么会有 FactoryBean?
    常用 Git 使用技巧,收藏了~
    Gin中context的使用
    Gin的路由算法
    k8s中的网络通信总结
    k8s架构
    Golang中的值拷贝与引用拷贝
    golang知识要点总结
  • 原文地址:https://www.cnblogs.com/Spare-No-Effort/p/13915184.html
Copyright © 2020-2023  润新知