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. JDBC 学习复习10 编写自己的JDBC框架

    首先万分感谢狼哥 孤傲苍狼 博客,整个jdbc学习的博客资料 链接为http://www.cnblogs.com/xdp-gacl/p/4006830.html 详细代码见狼哥博客,列出我学习过程中遇 ...

  2. ASP.NET WEB应用程序(.network4.5)MVC Razor视图引擎2 Areas区域说明

    https://www.cnblogs.com/webapi/p/5976642.html Asp.Net MVC Areas区域说明   一般网站分为前台+会员后台+管理员后台,做过webform的 ...

  3. Django2.0 开始一个项目

    python项目运行环境: 安装虚拟环境工具   pip install virtualenv 使用虚拟环境: 创建虚拟环境: virtualenv  <虚拟环境名称> 进去虚拟环境: S ...

  4. 实现Bootstrap表格拖拽

    实现Bootstrap表格拖拽: 需要引入jquery.min.js.bootstrap相关文件,以及jquery.dragsort-0.5.2.js 代码如下: <html> <h ...

  5. JS实现当前选择日期是星期几

    使用到的日期插件是My97 Datepicker,这里通过onpicked方法触发getDay()方法,在getDay()方法中获取已选择的日期来判断是星期几. 插件下载地址:http://www.m ...

  6. vs Code编辑器智能提示功能

    一.Node.Js的Typings工具可以用于Visual Studio Code的代码补全 1.vscode 的默认只有es原声api带有自动补全的功能,现在V1.9的版本默认已经支持NodeJS的 ...

  7. el-select 可选择可输入

    <el-select v-model="saveWardForm.wardCode" placeholder="" filterable @blur=&q ...

  8. iOS热更新实现方式

    heart.jpg 苹果静止热更新,可惜我的是企业app,没有这些约束了,随便用.(当然有些热更新已经可以通过苹果审核了,比如JSPatch)官网说的: JSPatch 平台 SDK 1.7.2 以上 ...

  9. stm32 i2c eeprom 24C02

    电路图 相关文章:http://blog.csdn.net/zhangxuechao_/article/details/74936798 举例 #define i2c_scl PBout(10) #d ...

  10. 深度学习_1_Tensorflow_2_数据_文件读取

    tensorflow 数据读取 队列和线程 文件读取, 图片处理 问题:大文件读取,读取速度, 在tensorflow中真正的多线程 子线程读取数据 向队列放数据(如每次100个),主线程学习,不用全 ...