luogu2885
P2885 [USACO07NOV]电话线Telephone Wire
给出若干棵树的高度,你可以进行一种操作:把某棵树增高h,花费为h*h。
操作完成后连线,两棵树间花费为高度差*定值c。
求两种花费加和最小值。
输入输出样例
5 2
2
3
5
1
4
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的更多相关文章
随机推荐
- SpringCloud Hystrix 参数
hystrix.command.default和hystrix.threadpool.default中的default为默认CommandKey Command PropertiesExecution ...
- centos从安装到环境配置
1.安装centos6.5 http://jingyan.baidu.com/article/25648fc1a235c99191fd0008.html 2.配置网络ip http://ji ...
- tornado基本使用一
一.tornado web程序编写思路 . 创建web应用实例对象,第一个初始化参数为路由映射列表 . 定义实现路由映射列表中的handler类 . 创建服务器实例, 绑定服务器端口 . 启动当前线程 ...
- 连接MySQL报错误代码 ERROR 1045时的解决方案
最近在做网站迁移的时候,遇到了一件很尴尬的事情,远程连接数据连不上了,一直报 错误号码1045 Access denied for user 'root'@xx.xxx.xxx.xx( ...
- Centos超详细安装步骤
Linux中三大主流操作系统 Ubuntu 优点:用户界面友好.工具完善 缺点:vps(虚拟服务器)成本较高.不具备商业化服务器操作系统 Centos--目前常用centos6.x,centos7.x ...
- IMSI-catcher:可发现附近手机敏感信息的工具
严正声明:该工具主要是为了让大家更好的了解GSM网络的工作原理而设计开发的,请不要用于恶意目的! 前言 IMSI-catcher是一个可以帮助你发现附近手机的IMSI号码,国家,品牌和运营商等信息 ...
- jquery进行each遍历时,根据条件取消某项操作
示例代码: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" c ...
- 使用pyinstaller打包使用cx_Oracle模块的程序出现The specified module could not be found的问题
pyinstaller看起来并不会将动态链接库自动打包,所以我们需要告诉pyinstaller要打包哪些动态链接库,步骤如下(假设python文件名为 oracletest.py): 1. 使用pyi ...
- 有关PHPstorm的git环境的配置和git密钥的生成总结
phpstorm上配置git环境的配置总感觉很简单,没发现看似简单的东西浪费我好多时间.我在网上查了一下关于phpstorm的git环境的配置没有具体的总结 所以我把自己的配过程简单总结了一下 接下来 ...
- 2018年6月2日-徐州ICPC邀请赛日志-收获第一枚icpc奖牌
2018年徐州ICPC邀请赛日志 Z的预言成真了,在正式比赛的前一天他的说说是“last one”,没错正赛后就是铜牌区的最后一名.最后揭榜前的15分钟,我们三个如坐针毡,最后奇迹诞生了! ...