P4267 [USACO18FEB]Taming the Herd
说实话感觉不是一道蓝题……感觉挺水的,不过为了水题解,水题就够了(其实是觉得思考的过程比较典型,记录一下)
题解
刚开始看这道题感觉上没什么思路,但是我们可以先考虑用 \(O(n)\) 的时间去枚举发生的出逃次数,再用 \(O(n^2)\) 的时间去计算每一个出逃次数的情况下不一致条目的最小值。
现在我们考虑对于任意一个出逃次数 \(d\) ,我们如何计算。不妨设 \(f_{i,j}\) 表示到第 \(i\) 个点出逃过 \(j\) 次的最小差异值,易得 \(dp\) 方程为:
\]
其中 \(cost_{l,r}\) 是指:区间 \(l\) ~ \(r\) 为一次完整的出逃区间(即其中没有发生过一次出逃且 \(l\) 和 \(r+1\) 发生了出逃)时的差异值。可以发现这个东西是可以 \(O(n^2)\) 预处理的。
那么现在需要枚举 \(i\) ,\(j\) ,\(k\) ,\(d\),复杂度为 \(O(n^4)\) ,肯定是不行的,但是我们可以发现在处理略大的 \(d\) 值时其实是可以计算出较小的 \(d\) 值的,所以我们可以直接一起计算,就不需要枚举 \(d\) 了,复杂度就降为 \(O(n^3)\) ,可行了。
代码如下:
#include<bits/stdc++.h>
using namespace std;
const int N=105;
int n,a[N];
int cost[N][N],f[N][N];
int main()
{
cin>>n;
for(int i=1;i<=n;++i)
scanf("%d",&a[i]);
for(int i=1;i<=n;++i)
{
for(int j=i;j<=n;++j)
cost[i][j]=cost[i][j-1]+(a[j]!=j-i);
}
// for(int i=1;i<=n;++i)
// {
// for(int j=i;j<=n;++j)
// printf("%d %d %d\n",i,j,cost[i][j]);
// }
memset(f,63,sizeof(f));
for(int i=1;i<=n;++i)
{
f[i][1]=cost[1][i];
for(int j=1;j<i;++j)
{
for(int k=1;k<=j;++k)
f[i][k+1]=min(f[i][k+1],f[j][k]+cost[j+1][i]);
}
}
for(int i=1;i<=n;++i)
printf("%d\n",f[n][i]);
return 0;
}
P4267 [USACO18FEB]Taming the Herd的更多相关文章
- 解题:USACO18FEB Taming the Herd
题面 从零开始的DP学习系列之贰(我的DP真的就这么烂TAT) 设DP状态的另一个技巧,考虑题目中有关答案的各种信息 然后这种和结尾有关系的$dp$可以考虑向前找结尾来转移 设$dp[i][j]$表示 ...
- [USACO18FEB]Taming the Herd
Luogu4267 题解 对于\(dp[i][j]\) , 预处理出一些转移一步的次数 , 然后可以很方便的转移 : \(dp[i][j]=min(dp[k][j-1]+cnt[j][i])\)
- BZOJ5196: [Usaco2018 Feb]Taming the Herd(DP暴力)
5196: [Usaco2018 Feb]Taming the Herd Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 78 Solved: 71[ ...
- 2019 GDUT Rating Contest II : A. Taming the Herd
题面: A. Taming the Herd Input file: standard input Output file: standard output Time limit: 1 second Me ...
- DP小题集
P2736 "破锣摇滚"乐队 Raucous Rockers 你刚刚继承了流行的"破锣摇滚"乐队录制的尚未发表的N(1 <= N <= 20)首歌的 ...
- USACO比赛题泛刷
随时可能弃坑. 因为不知道最近要刷啥所以就决定刷下usaco. 优先级排在学习新算法和打比赛之后. 仅有一句话题解.难一点的可能有代码. 优先级是Gold>Silver.Platinum刷不动. ...
- hdu 2715 Herd Sums
Herd Sums Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- POJ 2140 Herd Sums
http://poj.org/problem?id=2140 Description The cows in farmer John's herd are numbered and branded w ...
- zookeeper分布式锁避免羊群效应(Herd Effect)
本文(转自:http://jm-blog.aliapp.com/?p=2554)主要讲述在使用ZooKeeper进行分布式锁的实现过程中,如何有效的避免“羊群效应( herd effect)”的出现. ...
随机推荐
- java服务器部署开源项目(若依)
1准备工作 (1)阿里云 centos_8_0_x64_20G_alibase_20200218.vhd [root@iZ2zeeqw5fxmm9zagf439aZ ~]# cat /etc/redh ...
- Java开发环境搭建(若jdk8按默认安装后没有jre文件夹,卸载重装时选择完整安装)
JDK下载与安装(JDK 8是主流,新版版就是增加了一些新特性) 卸载旧JDK 删除java的安装目录 删除JAVA_HOME 删除path下关于java的目录 在cmd命令行中输入java vers ...
- ssh2中的添,删,查,改。
1.spring封装的HibernateTemplate类的一些操作方法. 2.session提供的根据主键ID进行添.删.查.改的基本方法. 由session得到的hql语句 由session得到的 ...
- nginx开启目录浏览
使用nginx作为下载站点,开启目录浏览的功能 在/etc/nginx/sites-enabled/default中添加: autoindex on ; autoindex_exact_size of ...
- 算法学习笔记:Tarjan算法
在上一篇文章当中我们分享了强连通分量分解的一个经典算法Kosaraju算法,它的核心原理是通过将图翻转,以及两次递归来实现.今天介绍的算法名叫Tarjan,同样是一个很奇怪的名字,奇怪就对了,这也是以 ...
- 关于Boom 3D“夜间模式”的妙用
Boom 3D的"夜间模式"不仅能够优化音效,减小高分贝声音的突然刺激,让你夜晚的聆听效果更加舒适,还能将音效运用到各种环境中. 下面小编就给大家讲一讲如何更好的利用Boom 3D ...
- synchronized关键字的内存语义
以下内容摘自:Java并发编程之美 加锁和释放锁的语义:当获取锁以后会清空锁块内本地内存中将会被用到的共享变量,在使用这些共享变量的时从主内存进行加载,在释放锁时将本地内存中修改的 共享变量刷新到主内 ...
- Codeforces Round #661 (Div. 3) D、E1 题解
D. Binary String To Subsequences #贪心 #构造 题目链接 题意 给定一个\(01\)串\(s\),完全分割成若干子序列(注意,不要混淆子串与子序列的概念),其中的子序 ...
- SpringBoot整合Elasticsearch7
SpringBoot连接ElasticSearch有以下种方式, TransportClient,9300端口,在 7.x 中已经被弃用,据说在8.x 中将完全删除 restClient,9200端口 ...
- django搭建
1.进入终端使用虚拟环境安装---pip install django==2.2 2.创建新的工程django-admin startproject bookpro 3.创建app或模块 使用djan ...