热门标签 | HotTags
当前位置:  开发笔记 > 人工智能 > 正文

USACO动态规划二测总结

前言+总结这次七点半开始,两个半小时四道题,最终156.xxx哭唧唧。被硕神虐到爆。scy说有一道AC自动机+dp,好了蒟蒻还没搞自动姬呢!翻了下题目,嗯第四题,看了几眼

前言+总结

这次七点半开始,两个半小时四道题,最终156.xxx哭唧唧。被硕神虐到爆。scy说有一道AC自动机+dp,好了蒟蒻还没搞自动姬呢!翻了下题目,嗯第四题,看了几眼不怎么看懂又不会自动姬就先直接判死刑。

先打的第一题,画了一下发现是看斜率的,样例解释坑死。打了个O(n^2)的dp,看了范围手动测了几组数据目测能过,下一题!啊第二题应该是个三维dp,我写了下状态,感觉状态转移有点虚(莫名慌)。于是去打了暴力(贪心那种)发现样例调都不对,真的一直调调到八点半快九点了!(没有发现样例就在卡贪心= =)然后先跳过打第三题,最后只想到了乱搞搞到O(n^2),明显超时的算法,但是目前来看无论能不能A先骗分吧。滚回去调第二题暴力,发现了贪心bug,改了一下过样例后就去虚一下三维dp,样例很快过了,手动和暴力对拍了几下。时间也就剩几分钟了。就这样吧。

最后,发现,第一次存斜率的初始化!!清成0了可能是负数的啊QWQ 第二题for循环打反了反了!我不会说一开始打对了,打着打着方程觉得应该反过来还觉得幸好自己发现了有点机智的(= =简直mdzz啊) 第三题n方算法有50分也算意料之中,第一二题跪到只有一半分orzorzorz(可能应该说居然这样还有一半分)

感觉总结没什么好说总结嘛,多吃核桃弥补脑子残疾,把还没搞的算法学完。细节要多考虑!

题意+题解

第一题bzoj 1721[Usaco2006 Mar]Ski Lift 缆车支柱


解释那里的 因为9海拔较高 有误啊!应该是因为较低吧。

这个我的算法跟别人的有点不一样,O(nm)≈O(n^2)吧也。

设sp[j]表示j后面的点到j的斜率的最大值,随着dp不断更新,并不是预处理。

f[i]表示在i点建站,且搞定之前所要建的个数。

明显方程就是f[i]=min(f[i],f[j]+1); 

j扫i的前m个,判断i到j的斜率是否大于i前面的点到j的最大斜率,这个时候就用到了sp[j],随便更新sp[j]。

附代码

#include
#include
#include
#include
#include
using namespace std;
typedef long long LL;
#define maxn 5100

LL mymin(LL x,LL y){return (xLL f[maxn],h[maxn];double sp[maxn];
double slop(int j1,int j2)
{
return 1.0*(h[j2]-h[j1])/(j2-j1);
}
int main()
{
//freopen("skilift.in","r",stdin);
//freopen("skilift.out","w",stdout);
int n,m,i,j;
scanf("%d%d",&n,&m);
for (i=1;i<=n;i++)
{
scanf("%I64d",&h[i]);
if (i!=1) sp[i-1]=slop(i-1,i);
}
memset(f,63,sizeof(f));
f[1]=1;
for (i=2;i<=n;i++)
{
for (j=1;j<=m;j++)
if (i>j)
{
double ls=slop(i-j,i);
if (ls>=sp[i-j])
{
f[i]=mymin(f[i],f[i-j]+1);
sp[i-j]=ls;
}
}else break;
f[i]=mymin(f[i],f[i-1]+1);
}printf("%I64d\n",f[n]);
return 0;
}

=========================================

第二题poj 1946 Cow Cycling


三维dp,真的我觉得我的代码和做法比cgh的好多了!233

设f[i][j][k]表示用到第i只牛来当队首,j为队首剩下的体力,k为已经绕了多少圈。

枚举速度,方程就很容易写出来了。

然后要记得把换个队首的传下去。

代码里被屏蔽的那部分就是一开始打的暴力orz,能过一半点!

#include
#include
#include
#include
#include
#include
using namespace std;

int n,m,s,ans;
int f[30][110][110];
int mymin(int x,int y){return (x/*void baoli(int x,int ds,int qs,int t)
{
if (qs>=s) {ans=mymin(ans,t);return;}
if (x==0) return;
int orz=sqrt(ds);
if ((s-qs)*(s-qs)<=ds) {ans=mymin(ans,t+1);return;}
for (int i=orz;i>=1;i--)
baoli(x,ds-i*i,qs+i,t+1);
baoli(x-1,m-qs,qs,t);
}*/
int main()
{
//freopen("cycling.in","r",stdin);
//freopen("cycling.out","w",stdout);
int i,j,k,ii;
scanf("%d%d%d",&n,&m,&s);
//ans=s;baoli(n,m,0,0);
memset(f,63,sizeof(f));
f[1][m][0]=0;ans=s;
for (i=1;i<=n;i++)//枚举队首用到了第几只牛
for (j=m;j>=0;j--)//队首体力剩多少
{
for (ii=0;ii<=s;ii++)//已经绕了第几圈
{
for (k=1;k*k<=j;k++)//枚举下一分钟的速度
f[i][j-k*k][ii+k]=mymin(f[i][j-k*k][ii+k],f[i][j][ii]+1);
f[i+1][m-ii][ii]=mymin(f[i+1][m-ii][ii],f[i][j][ii]);
}ans=mymin(ans,f[i][j][s]);
}
printf("%d\n",ans);
return 0;
}
==========================================

第三题bzoj1587[Usaco2009 Mar]Cleaning Up 打扫卫生


这道题,可以想到分n个最多花的时间就是n嘛~如果超过的话我不如一个一个来打扫呢对吧。(这个我想到了!但是后面的就不行了去问了奥爷爷和男神还是不懂啊还说不是zz!qwq)所以分n个的话这其中的颜色种类个数不能超过根号n个。

先预处理与此同色的上一个位置和后一个位置。

设pos[],pos[]记录的是扫的这段中某种颜色第一次出现的位置。num[i]为pos[i]~目前扫到的位置间不同颜色种类的个数。诶诶诶好难表达啊语文不好啊><><><具体看代码意会orz

#include
#include
#include
#include
#include
#include
using namespace std;
#define maxn 40100

int w[maxn],a[maxn],f[maxn],nt[maxn];
int pos[maxn],num[maxn],pre[maxn];
int mymin(int x,int y){return (xint main()
{
//freopen("cleanup.in","r",stdin);
//freopen("cleanup.out","w",stdout);
int n,m,i,j,K;
scanf("%d%d",&n,&m);
memset(f,63,sizeof(f));
memset(nt,63,sizeof(nt));
memset(w,-1,sizeof(w));
for (i=1;i<=n;i++)
{
scanf("%d",&a[i]);
nt[w[a[i]]]=i;
pre[i]=w[a[i]];w[a[i]]=i;
}f[1]=1;K=floor(sqrt(n));
for (i=1;i<=K;i++) pos[i]=1,num[i]=1;
for (i=2;i<=n;i++)
{
for (j=1;j<=K;j++)//枚举前面的颜色种数,不能超过K=根号n
{
if (pre[i]{
num[j]++;//如果不在就说明这个区间内的颜色种类+1
if (num[j]>j) //超出限制的话就要删掉最前面的一种颜色
{
while (nt[pos[j]]<=i) pos[j]++;
pos[j]++;num[j]--;
}
}f[i]=mymin(f[i],f[pos[j]-1]+num[j]*num[j]);
}
}printf("%d\n",f[n]);
return 0;
}

诶这个本来是昨晚打的,为了国庆!今天发!随便祝祖国生快!~\(≧▽≦)/~啦啦啦~


推荐阅读
  • 本文详细探讨了KMP算法中next数组的构建及其应用,重点分析了未改良和改良后的next数组在字符串匹配中的作用。通过具体实例和代码实现,帮助读者更好地理解KMP算法的核心原理。 ... [详细]
  • 深入解析Android自定义View面试题
    本文探讨了Android Launcher开发中自定义View的重要性,并通过一道经典的面试题,帮助开发者更好地理解自定义View的实现细节。文章不仅涵盖了基础知识,还提供了实际操作建议。 ... [详细]
  • C++实现经典排序算法
    本文详细介绍了七种经典的排序算法及其性能分析。每种算法的平均、最坏和最好情况的时间复杂度、辅助空间需求以及稳定性都被列出,帮助读者全面了解这些排序方法的特点。 ... [详细]
  • 本文介绍如何利用动态规划算法解决经典的0-1背包问题。通过具体实例和代码实现,详细解释了在给定容量的背包中选择若干物品以最大化总价值的过程。 ... [详细]
  • 本文详细探讨了Java中的24种设计模式及其应用,并介绍了七大面向对象设计原则。通过创建型、结构型和行为型模式的分类,帮助开发者更好地理解和应用这些模式,提升代码质量和可维护性。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 题目描述:给定n个半开区间[a, b),要求使用两个互不重叠的记录器,求最多可以记录多少个区间。解决方案采用贪心算法,通过排序和遍历实现最优解。 ... [详细]
  • 深入理解C++中的KMP算法:高效字符串匹配的利器
    本文详细介绍C++中实现KMP算法的方法,探讨其在字符串匹配问题上的优势。通过对比暴力匹配(BF)算法,展示KMP算法如何利用前缀表优化匹配过程,显著提升效率。 ... [详细]
  • 探讨一个显示数字的故障计算器,它支持两种操作:将当前数字乘以2或减去1。本文将详细介绍如何用最少的操作次数将初始值X转换为目标值Y。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 本文探讨如何设计一个安全的加密和验证算法,确保生成的密码具有高随机性和低重复率,并提供相应的验证机制。 ... [详细]
  • 深入解析:手把手教你构建决策树算法
    本文详细介绍了机器学习中广泛应用的决策树算法,通过天气数据集的实例演示了ID3和CART算法的手动推导过程。文章长度约2000字,建议阅读时间5分钟。 ... [详细]
  • 在金融和会计领域,准确无误地填写票据和结算凭证至关重要。这些文件不仅是支付结算和现金收付的重要依据,还直接关系到交易的安全性和准确性。本文介绍了一种使用C语言实现小写金额转换为大写金额的方法,确保数据的标准化和规范化。 ... [详细]
  • 在给定的数组中,除了一个数字外,其他所有数字都是相同的。任务是找到这个唯一的不同数字。例如,findUniq([1, 1, 1, 2, 1, 1]) 返回 2,findUniq([0, 0, 0.55, 0, 0]) 返回 0.55。 ... [详细]
  • 本文探讨了卷积神经网络(CNN)中感受野的概念及其与锚框(anchor box)的关系。感受野定义了特征图上每个像素点对应的输入图像区域大小,而锚框则是在每个像素中心生成的多个不同尺寸和宽高比的边界框。两者在目标检测任务中起到关键作用。 ... [详细]
author-avatar
UNESCO媒介与女性教席走_890
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有