[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[ ...
随机推荐
- 使用OpenFileDialog组件打开对话框
实现效果: 知识运用: OpenFileDialog组件的ShowDialog方法 public DialogResult Show () //返回枚举值 DialogRrsult.OK 或 Di ...
- java常用 开源
http://sourceforge.nethttp://code.google.com/hosting/http://www.open-open.com/code/tags/Javahttp://w ...
- SummerVocation_Learning--java的线程死锁
public class Test_DeadLock implements Runnable { ; static Object o1 = new Object(),o2 = new Object() ...
- GPIO实现I2C协议模拟(2)
接着上一节继续补充 结合上一节的描述 写Slave的过程如下(BYTE) 读Slave的过程如下(BYTE) 分为两段 第一段 ,写OFFSET,第二段读数据 WORD的方式与BYTE大同异 读行为 ...
- JavaScript方法中this关键字使用注意
问题来源 本文是基于廖雪峰老师JavaScript课程中的方法一节以及阮一峰老师JavaScript 的 this 原理 所记. 首先,我们了解一下JavaScript中的方法:在一个对象中绑定函数, ...
- 自定义token,保存到客户端的cookie中,
自定义token #原理自定义token,放入cookie中,不用存数据库 #token定义方式 >>>>> "加密字符串"|登陆用户id|用户登陆时 ...
- Codeforces Round #443 (Div. 2) C 位运算
C. Short Program time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...
- B1007 素数对猜想
B1007 素数对猜想 让我们定义\(d_n\)为:\(d_n =p_{n+1}−p_n\),其中\(p_i\)是第i个素数.显然有\(d_1=1\),且对于n>1有\(d_n\)是偶数.&qu ...
- docker 学习(2)
docker容器中安装vim ubuntu 中默认未装vim,docker run ubuntu vim 出现: container_linux.go:247: starting container ...
- springMVC中接收数组参数
方式一. 后台:public ResultBean queryItemRulesByItemIds(int userId, int[] itemIds) 方式二.