[usaco jan 09] 气象牛 baric [dp]
题面:
思路:
题意有点绕,实际上就是给你一个计算规则,让你取最少的元素,通过这个计算方式,得到一个小于指定误差上限的结果
这个规则分为三个部分,这里分别用pre,sum,suf表示
因为给定的元素个数(天数)很少,可以使用O(n^3)算法,因此考虑使用经过了预处理的dp解决问题
具体地,设dp[i][j]表示前i个元素使用了j个且一定取用了第i个时可能达到的最小误差值
预处理:pre[i]表示通过第一种计算方式得到的,第一个元素取第i个时得到的误差
suf[i]同理,为第三种计算方式
sum[i][j]则表示取了i和j且不取中间的元素时,中间的元素产生的误差
这样dp[i][1]=pre[i],dp[i][j]=dp[k][j-1]+sum[k][i](k=1...i-1),然后用dp[i][j]+suf[j]更新答案即可
Code:
#include<iostream>
#include<vector>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define inf 0x7fffffff/2
using namespace std;
int n,m,a[];
int dp[][];
//dp[i][j]: prefix 1-i,chosen j
int pre[],suf[],sum[][];
int abs(int k){
if(k>=) return k;
else return -k;
}
int main(){
freopen("baric.in","r",stdin);
freopen("baric.out","w",stdout);
int i,j,k,tmp1,tmp2,t,l;
scanf("%d%d",&n,&m);
int ans=m,anss=n;
for(i=;i<=n;i++){
scanf("%d",&a[i]);
dp[i][]=;
}
for(i=;i<=n-;i++){
for(j=i+;j<=n;j++){
for(k=i+;k<j;k++){
sum[i][j]+=abs((a[k]<<)-a[i]-a[j]);
}
}
}
for(i=;i<=n;i++){
for(j=;j<i;j++) pre[i]+=abs(a[i]-a[j])<<;
dp[i][]=pre[i];
for(j=n;j>i;j--) suf[i]+=abs(a[i]-a[j])<<;
}
for(i=;i<=n;i++){
for(j=;j<=i;j++){
dp[i][j]=inf/;
for(k=;k<i;k++) dp[i][j]=min(dp[i][j],dp[k][j-]+sum[k][i]);
if(dp[i][j]+suf[i]<m){
if(j<ans) ans=j,anss=dp[i][j]+suf[i];
else if(j==ans&&dp[i][j]+suf[i]<anss) anss=dp[i][j]+suf[i];
}
}
}
printf("%d %d",ans,anss);
}
[usaco jan 09] 气象牛 baric [dp]的更多相关文章
- [BZOJ1575] [Usaco2009 Jan]气象牛Baric(DP)
传送门 DP f[i][j]表示前i个中选j个的最优解 预处理g[i][j]表示选i~j对答案的贡献 那么就可以n^3乱搞了! 注意边界 #include <cstdio> #includ ...
- bzoj 1575: [Usaco2009 Jan]气象牛Baric【dp】
完了不会dp了 设f[i][j]为以i结尾,有j个时的最优值,辅助数组g[i][j]为s选了i和j,i~j中的误差值 转移是f[j][i]=min(f[k][i-1]+g[k][j]) #includ ...
- bzoj:1575: [Usaco2009 Jan]气象牛Baric
Description 为了研究农场的气候,Betsy帮助农夫John做了N(1 <= N <= 100)次气压测量并按顺序记录了结果M_1...M_N(1 <= M_i <= ...
- bzoj1575 [Usaco2009 Jan]气象牛Baric
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1575 [题解] 动态规划,令f[i,j]表示前i个选了j个,且第i个必选的最小值. 转移就枚 ...
- 【动态规划】bzoj1575: [Usaco2009 Jan]气象牛Baric
预处理普通动态规划:庆祝1A三连 Description 为了研究农场的气候,Betsy帮助农夫John做了N(1 <= N <= 100)次气压测量并按顺序记录了结果M_1...M_N( ...
- [JZOJ]1293.气象牛[区间DP]
Description 为了研究农场的气候,Betsy帮助农夫John做了N(1 <= N <= 100)次气压测量并按顺序记录了结果M_1-M_N(1 <= M_i <= 1 ...
- [usaco jan 09] 安全路径 travel [最短路径树]
题面: 传送门 思路: 既然最后一条边不能走,那么就一定是换了一条路,一条不经过这最后一条边的路 如果想要这条路最短,那么其在路上一定尽可能多地走了最短路径 因此,我们对这张图跑一遍从1开始的单源最短 ...
- BZOJ 1679: [Usaco2005 Jan]Moo Volume 牛的呼声( )
一开始直接 O( n² ) 暴力..结果就 A 了... USACO 数据是有多弱 = = 先sort , 然后自己再YY一下就能想出来...具体看code --------------------- ...
- BZOJ1679: [Usaco2005 Jan]Moo Volume 牛的呼声
1679: [Usaco2005 Jan]Moo Volume 牛的呼声 Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 723 Solved: 346[ ...
随机推荐
- java 类和成员的修饰符
- Spring学习记录(一)
1.Spring简介 Spring是一个轻量级的java开发框架.框架的主要优势之一就是分层架构,Spring使用基本的JavaBean,不仅限于服务器的开发.从简单性,可测试性和松耦合的角度而言,任 ...
- Rhadoop安装
1.ubuntu,hadoop,R,jdk安装好 2.下载Rhadoop项目的的三个包,rmr,hdfs,rHBase存放到Downloads/R. 3.切换到root 4.安装依赖的库 ~R CMD ...
- python之enumerate
http://eagletff.blog.163.com/blog/static/116350928201266111125832/一般情况下,如果要对一个列表或者数组既要遍历索引又要遍历元素时,可以 ...
- java 代码优化
Java程序中的内存管理机制是通过GC完成的,“一个对象创建后被放置在JVM的堆内存中,当永远不在应用这个对象的时候将会被JVM在堆内存中回收.被创建的对象不能再生,同时也没有办法通过程序语句释放”( ...
- 关于小程序 input 组件内容显示不全(显示的长度不满 input 宽度)问题
问题:小程序的input组件经常用到,但在使用input组件的时候会出现一种现象:明明设置了input的宽度,但是输入的内容显示的长度范围却怎么都不到一整个input组件的宽度,而且后面没显示的地方无 ...
- 2.3.3 zerosum 和为零
#include<bits/stdc++.h> using namespace std; ],a; ]={' ','+','-'}; void out() { ;i<a;i++) c ...
- linux系统监控工具glances
glances linux系统自带了很多系统性能监控工具,如top,vmstat,iftop等等,还有一款监视工具glances,它能把其他几个监控的指标都集于一身.Glances是一个相对比较新的系 ...
- 五、Linux 远程登录
Linux 远程登录 Linux一般作为服务器使用,而服务器一般放在机房,你不可能在机房操作你的Linux服务器. 这时我们就需要远程登录到Linux服务器来管理维护系统. Linux系统中是通过ss ...
- Emgu.CV.CvInvoke的类型初始值设定项引发异常
被这个问题蛋疼了一个下午,终于解决了.我的服务器出现这个问题的原因:可能是没有安装emgucv. 解决方法: 1.下载并安装emgucv 下载地址:链接: https://pan.baidu.com/ ...