题目链接:https://www.luogu.org/problemnew/show/P2933

Description

  为了研究农场的气候,Betsy帮助农夫John做了N(1 <= N <= 100)次气压测量并按顺序记录了结果M_1...M_N(1 <= M_i <= 1,000,000).
  Betsy想找出一部分测量结果来总结整天的气压分布. 她想用K(1 <= K <= N)个数s_j
(1 <= s_1 < s_2 < ... < s_K <= N)来概括所有测量结果. 她想限制如下的误差:
  对于任何测量结果子集,每一个非此子集中的结果都会产生误差.总误差是所有测量结果的误差之和.更明确第说, 对于每一个和所有s_j都不同的i:
  * 如果 i 小于 s_1, 误差是:2 * | M_i - M_(s_1) | 
  * 如果i在s_j和s_(j+1)之间,误差是:| 2 * M_i - Sum(s_j, s_(j+1)) | 
  注:Sum(x, y) = M_x + M_y; (M_x 和 M_y 之和)
  * 如果i大于s_K,误差为:2 * | M_i - M_(s_K) |
  Besty给了最大允许的误差E (1 <= E <= 1,000,000),找出最小的一部分结果使得误
差最多为E.
 

Input

  第一行: 两个空格分离的数: N 和 E
  第2..N+1行: 第i+1行包含一次测量记录:M_i

Output

  第一行: 两个空格分开的数: 最少能达到误差小于等于E的测量数目和使用那个测量数目能达到的最小误差.
 

Sample Input

4 20
10
3
20
40

Sample Output

2 17

题目大意就是给你一个集合,告诉你如何判定它的子集是否合法并让你找到一个最优子集

解法:

首先我们预处理出一个数组pre,pre[i][j]保存在i到j之间元素对误差的贡献,即我们枚举z(j-1>=z>=i+1),计算abs(2*m[z]-m[i]-m[j])

特殊的是,我们还需要处理出pre[i][0]和pre[i][n+1],分别表示在i之间和在i之后的元素对误差的贡献(感觉贡献这个词怪怪的)

预处理时间复杂度O(n3)

考虑如何DP

定义DP[i][j]表示前j个元素,必选第j个元素,总共选择了i个产生的最小误差。为什么把i放在前,j放在后呢?因为我们首先最小化的是子集的大小。状态转移方程就是:

dp[i][j]=min(dp[i][j],dp[i-1][q]+sum)(i-1<=q<=j)

我们有sum=-pre[q][n+1]+pre[q][j]+pre[j][n+1](之前我们是把q当成是子集的结尾并加上了它之后对误差的贡献,于是此时我们减去这个值改为用j来作为最后一个元素)

DP时间复杂度O(n3)

注意i=1的情况我们提前处理出来就是了

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<math.h>
#define ri register int
#define ll long long
using namespace std; const int maxn=+;
const int inf=0x3f3f3f3f;
int n,e,k;
ll ans;
int m[maxn];
ll dp[maxn][maxn],pre[maxn][maxn];
int main()
{
scanf("%d%d",&n,&e);
for (ri i=;i<=n;i++)
scanf("%d",&m[i]);
for (ri i=;i<=n;i++)
{
for (ri j=i+;j<=n;j++)
for (ri k=i+;k<=j-;k++)
pre[i][j]+=abs(*m[k]-m[i]-m[j]);
for (int j=;j<i;j++) pre[i][]+=*abs(m[j]-m[i]);
for (int j=i+;j<=n;j++) pre[i][n+]+=*abs(m[j]-m[i]);
}
k=n;ans=inf;
for (ri i=;i<=n;i++)
{
dp[][i]=pre[i][]+pre[i][n+];
if (dp[][i]<=e)
{
k=;
if (dp[][i]<ans) ans=dp[][i];
}
}
for (ri i=;i<=n;i++)
{
for (ri j=i;j<=n;j++)
{
dp[i][j]=inf;
for (ri q=i-;q<j;q++)
{
int sum=-pre[q][n+]+pre[q][j]+pre[j][n+];
dp[i][j]=min(dp[i][j],dp[i-][q]+sum);
}
if (dp[i][j]<=e)
{
if (i<k) {k=i;ans=dp[i][j];}
if (i>k) continue;
if (i==k) ans=min(ans,dp[i][j]);
}
}
}
printf("%d %lld\n",k,ans);
return ;
}

[USACO09JAN] 气象测量/气象牛The Baric Bovine 解题报告(DP)的更多相关文章

  1. <USACO09JAN>气象测量/气象牛The Baric Bovineの思路

    我..莫名其妙搞出来的 随便搞搞..幻想中的dp结果对了 我也很迷茫 Description 为了研究农场的气候,Betsy帮助农夫John做了N(1 <= N <= 100)次气压测量并 ...

  2. 洛谷 P2862 [USACO06JAN]把牛Corral the Cows 解题报告

    P2862 [USACO06JAN]把牛Corral the Cows 题目描述 Farmer John wishes to build a corral for his cows. Being fi ...

  3. BZOJ 1051 最受欢迎的牛 解题报告

    题目直接摆在这里! 1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4438  Solved: 2353[S ...

  4. P2933 [USACO09JAN]气象测量The Baric Bovine

    传送门 挺显然的 $dp$ ,然鹅一开始想的是 $dfs$ 乱剪剪枝搞了 $70$ 分... 设 $f[i][j]$ 表示切了 $i$ 次,当前切的位置为 $j$ 的最小误差 那么转移显然枚举上一个切 ...

  5. 中国气象网 气象数据开放平台 API用法 (Android)

    因为要做个天气应用.须要找个天气的API.上网上搜了下都是那几个,并且基本都过时了.百度有个天气API,只是貌似仅仅能提供当天的.网上提到的中国气象接口的文章,大都用的时旧API,有的被封了,有的永远 ...

  6. 牛客练习赛 小D的剑阵 解题报告

    小D的剑阵 题意链接: https://ac.nowcoder.com/acm/contest/369/F 来源:牛客网 现在你有 \(n\) 把灵剑,其中选择第i把灵剑会得到的 \(w_i\) 攻击 ...

  7. 牛客练习赛 小A与任务 解题报告

    小A与任务 链接: https://ac.nowcoder.com/acm/contest/369/B 来源:牛客网 题目描述 小A手头有 \(n\) 份任务,他可以以任意顺序完成这些任务,只有完成当 ...

  8. 洛谷 P2341 [HAOI2006]受欢迎的牛 解题报告

    P2341 [HAOI2006]受欢迎的牛 题目描述 每头奶牛都梦想成为牛棚里的明星.被所有奶牛喜欢的奶牛就是一头明星奶牛.所有奶 牛都是自恋狂,每头奶牛总是喜欢自己的.奶牛之间的"喜欢&q ...

  9. 牛客OI周赛7-普及组 解题报告

    出题人好评. 评测机差评. A 救救喵咪 二位偏序.如果数据范围大的话直接树状数组,不过才1000就\(O(n^2)\)暴力就ok了. #include <bits/stdc++.h> s ...

随机推荐

  1. EOSS V3.0.2 企业运营支撑系统(基于RBAC原理的权限管理)

    下载地址:https://github.com/jelly-liu/EOSS 一:EOSS 功能介绍 其于用户,角色,权限,资源(即菜单)的一套"简约有用"的权限管理系统,可在其基 ...

  2. objective-c訪问控制符

    objective-c中成员变量的四个訪问控制符: @private:仅仅有当前类的内部才干訪问 @public:全部人都可訪问 @protected:仅仅限当前类和它的子类可以訪问 @package ...

  3. server.htaccess 具体解释以及 .htaccess 參数说明

    .htaccess文件(或者"分布式配置文件")提供了针对文件夹改变配置的方法. 即.在一个特定的文档文件夹中放置一个包括一个或多个指令的文件, 以作用于此文件夹及其所有子文件夹. ...

  4. Ubuntu: GlusterFS+HBase安装教程

    HBase通常安装在Hadoop HDFS上,但也能够安装在其它实现了Hadoop文件接口的分布式文件系统上.如KFS. glusterfs是一个集群文件系统可扩展到几peta-bytes. 它集合了 ...

  5. xBIM 基础09 WeXplorer 基本应用

    系列目录    [已更新最新开发文章,点击查看详细]  在本教程中,将学习如何创建最基本和最直接的查看器. 除了展示建筑模型外,不做其他任何操作.它将只使用内置导航,但是不会对按钮做出事件响应. &l ...

  6. BZOJ 1898 构造矩阵+矩阵快速幂

    思路: T的最小公倍数是12 那么12以内暴力 整除12 的部分用矩阵快速幂 //By SiriusRen #include <cstdio> #include <cstring&g ...

  7. Codeforces 659F Polycarp and Hay 并查集

    链接 Codeforces 659F Polycarp and Hay 题意 一个矩阵,减小一些数字的大小使得构成一个连通块的和恰好等于k,要求连通块中至少保持一个不变 思路 将数值从小到大排序,按顺 ...

  8. 关于PageRank的总结

    好久不用CSDN,最近想给带的本科生实验课开个期末习题专题页,发现CSDN的博客忽然要绑定之类.只好弃用回博客园写学习总结了.塞翁失马焉知非福. *************************** ...

  9. ZBrush中独特功能Projection Master

    Projection Master可以理解为投影大师,它是ZBrush®的一个独特功能,该功能可以让用户使用所有的2D和2.5D笔刷工具在3D模型上进行雕刻.纹理绘制和其他的操作. 简单来说,Proj ...

  10. javaweb集成swagger

    一.添加依赖 <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-sw ...