P2885 [USACO07NOV]电话线Telephone Wire

给出若干棵树的高度,你可以进行一种操作:把某棵树增高h,花费为h*h。

操作完成后连线,两棵树间花费为高度差*定值c。

求两种花费加和最小值。

输入输出样例

输入 #1复制

5 2
2
3
5
1
4
输出 #1复制

15

sol:显然暴力的dp很容易得到,dp[i][j]表示第i个高度为j个最小代价
#include <bits/stdc++.h>
using namespace std;
typedef int ll;
inline ll read()
{
ll S=; char ch=' '; bool f=;
while(!isdigit(ch)) {f|=(ch=='-'); ch=getchar();}
while(isdigit(ch)) {S=(S<<)+(S<<)+(ch-''); ch=getchar();}
return (f)?(-S):(S);
}
#define R(x) x=read()
inline void write(ll x)
{
if(x<) {putchar('-'); x=-x;}
if(x<) {putchar(x+''); return;}
write(x/); putchar(x%+'');
}
#define W(x) write(x),putchar(' ')
#define Wl(x) write(x),putchar('\n')
const int N=,M=,inf=0x3f3f3f3f;
int n,c,hig[N],mx,ans;
int dp[N][M];
inline int sqr(int x){return x*x;}
int main()
{
freopen("luogu2885_data.in","r",stdin);
int i,j,k;
R(n); R(c);
for(i=;i<=n;i++)
{
R(hig[i]); mx=max(mx,hig[i]);
}
memset(dp,,sizeof dp);
dp[][hig[]]=;
for(i=;i<=mx-hig[];i++) dp[][hig[]+i]=i*i;
for(i=;i<=n;i++)
{
for(j=hig[i];j<=mx;j++) for(k=hig[i-];k<=mx;k++)
{
dp[i][j]=min(dp[i][j],dp[i-][k]+sqr(j-hig[i])+c*abs(j-k));
}
}
ans=inf;
for(i=hig[n];i<=mx;i++) ans=min(ans,dp[n][i]);
Wl(ans);
return ;
}

然后发现容易拆开abs分类讨论一下即可

#include <bits/stdc++.h>
using namespace std;
typedef int ll;
inline ll read()
{
ll s=; bool f=; char ch=' ';
while(!isdigit(ch)) {f|=(ch=='-'); ch=getchar();}
while(isdigit(ch)) {s=(s<<)+(s<<)+(ch^); ch=getchar();}
return (f)?(-s):(s);
}
#define R(x) x=read()
inline void write(ll x)
{
if(x<) {putchar('-'); x=-x;}
if(x<) {putchar(x+''); return;}
write(x/); putchar((x%)+'');
}
#define W(x) write(x),putchar(' ')
#define Wl(x) write(x),putchar('\n')
const int N=,inf=0x3f3f3f3f;
int n,c,mx,hig[N];
int dp[N][],mn[];
inline int sqr(int x){return x*x;}
int main()
{
freopen("luogu2885_data.in","r",stdin);
int i,j;
R(n); R(c);
for(i=;i<=n;i++) mx=max(mx,hig[i]=read());
memset(dp,,sizeof dp);
for(i=hig[];i<=mx;i++) dp[][i]=sqr(i-hig[]);
for(i=;i<=n;i++)
{
for(j=;j<=hig[i-]-;j++) mn[j]=inf;
for(j=hig[i-];j<=mx;j++) mn[j]=min(mn[j-],dp[i-][j]-c*j);
for(j=hig[i];j<=mx;j++) dp[i][j]=min(dp[i][j],mn[j]+sqr(j-hig[i])+c*j);
mn[mx+]=inf;
for(j=mx;j>=hig[i-];j--) mn[j]=min(mn[j+],dp[i-][j]+c*j);
for(j=hig[i-]-;j>=;j--) mn[j]=mn[hig[i-]];
for(j=hig[i];j<=mx;j++) dp[i][j]=min(dp[i][j],mn[j]+sqr(j-hig[i])-c*j);
// for(j=hig[i];j<=mx;j++) cout<<i<<' '<<j<<' '<<dp[i][j]<<endl; putchar('\n');
}
int ans=inf;
for(j=hig[n];j<=mx;j++) ans=min(ans,dp[n][j]);
Wl(ans);
return ;
}

ac

 

luogu2885的更多相关文章

随机推荐

  1. vim编辑器中的替换(转)

    转1:https://www.cnblogs.com/david-wei0810/p/6385988.html 转2:https://blog.csdn.net/doubleface999/artic ...

  2. leetcode --165--php

    class Solution { /** * @param String $version1 * @param String $version2 * @return Integer */ functi ...

  3. jQuery_jQuery的两把利器

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  4. 基于【 centos7】三 || 分布式文件系统FastDFS+Nginx环境搭建

    1. FastDFS介绍 1.1 FastDFS定义 FastDFS是用c语言编写的一款开源的分布式文件系统.FastDFS为互联网量身定制,充分考虑了冗余备份.负载均衡.线性扩容等机制,并注重高可用 ...

  5. 字蛛webfont 安装及使用方法

    先安装nodejs和git,比如放在D:/nodejs/  文件夹 cmd 进入该文件夹,安装npm install express 安装 npm install font-spider -g 安装  ...

  6. PHP常见函数

    有时候,运行nginx和PHP CGI(PHP FPM)web服务的Linux服务器,突然系统负载上升,用top命令查看,很多phpcgi进程的CPU利用率接近100%后来通过跟踪发现,这种情况与PH ...

  7. jvm系列(七):jvm调优

    转自:https://www.cnblogs.com/ityouknow/p/6437037.html 16年的时候花了一些时间整理了一些关于jvm的介绍文章,到现在回顾起来还是一些还没有补充全面,其 ...

  8. 使用apache的HttpClient进行http通讯,隐藏的HTTP请求头部字段是如何自动被添加的

    我们用apache的HttpClient这个库消费云端的Restful API时,一般都需要两次HTTP调用,第一次获得某种token,比如获取防止跨域请求伪造攻击Cross-site request ...

  9. 第三章、vue-项目前端 - vue配置 | axios配置 | cookies配置 | element-ui配置 | bootstrap配置

    目录 vue项目创建 环境 创建项目 重构项目目录 文件修订:目录中非配置文件的多余文件可以移除 全局配置:全局样式.配置文件 axios前后台交互 cookies操作 element-ui页面组件框 ...

  10. 用pythoninstall cefpython打包exe,制作自己的浏览器

    cefpython浏览器 介绍 用pythoninstall cefpython打包exe,制作自己的浏览器, 软件架构 PyInstaller: 3.4 Python: 3.5.4 Platform ...