[USACO精选] 第二章 动态规划(一)
#4 公司利润 2014-01-16
这真的是动归?怎么觉得有点贪心的心态在。时间复杂度O(N),空间复杂度O(1),轻松加愉快!唯一要注意的是ANS一开始要赋负值,因为最终答案可能是负的。
program usaco_;
var n,i,x,ans,last:longint;
a:array[..] of longint;
begin
ans:=-maxlongint+;
readln(n);
for i:= to n do
begin
readln(x);
if last> then last:=x+last else last:=x;
if last>ans then ans:=last;
end;
writeln(ans);
end.
公司利润
#5 接住苹果 2014-01-17
亲娘说:“我给你榨胡萝卜汁吧,10分钟就好。”我说:“嗯,看我十分钟能不能把这题写出来。”差不多刚好十分钟,因为亲娘用了五分钟不到就榨好了…
a[i,j,p]表示第i只苹果掉落后,经过j次移动,最后一次接苹果是在p树下可以接到的最多苹果树。
可以优化的地方就是,反正计算a[i,j,p]只是和a[i-1,j-1,1..2]和a[i-1,j,1..2]有关嘛,所以不开数组应该也无妨吧。
写的时候犯了两个小错误:(1)for j:=0 to k do 写成了1 to k;(2)把循环里的j都写成了k… 都是脑残错误…
program usaco_;
var a:array[..,-..,..] of integer;
q:array[..,..] of word;
n,k,i,j,p1,p2,t,ans:integer;
begin
readln(n,k);
for i:= to n do
begin
readln(t);
q[i,t]:=;
end;
ans:=-+;
for i:= to n do
for j:= to k do
begin
p1:=a[i-,j,]+q[i,];p2:=a[i-,j-,]+q[i,];
if p1>p2 then a[i,j,]:=p1 else a[i,j,]:=p2;
if a[i,j,]>ans then ans:=a[i,j,];
p1:=a[i-,j,]+q[i,];p2:=a[i-,j-,]+q[i,];
if p1>p2 then a[i,j,]:=p1 else a[i,j,]:=p2;
if a[i,j,]>ans then ans:=a[i,j,];
end;
writeln(ans);
end.
接住苹果
BTW,这题因为是NOV04的题目,找数据找了会儿…最后发现只要改这个网址的最后就行了:http://cerberus.delos.com:794/NOV04
#6 方形牛棚 2014-01-17
似乎做过类似的题,似乎知道是四个小正方形拼成一个大的,就是脑残没想出动态转移方程:a[i,j]:=min(a[i-1,j],a[i-1,j-1],a[i,j-1])+1 {a[i,j]表示以(i,j)为右下角可取的正方形的最大边长} 现在处于脑残题也做不来,难题也不会的境界啊…
BTW,此题也是USACO Training 5.3.4。
program usaco_;
var a,map:array[..,..] of word;
n,m,i,j,tx,ty,ans:integer; function min(x,y,z:integer):integer;
begin
min:=x;
if y<min then min:=y;
if z<min then min:=z;
end; begin
readln(n,m);
for i:= to m do
begin
readln(tx,ty);
map[tx,ty]:=;
end;
for i:= to n do
for j:= to n do
if map[i,j]<> then
begin
a[i,j]:=min(a[i-,j],a[i-,j-],a[i,j-])+;
if a[i,j]>ans then ans:=a[i,j];
end;
writeln(ans);
end.
方形牛棚
其实做不大的改动也可成为求最大的矩形牛棚的程序。
#7 滑雪课程 2014-01-22
脑残的我回来了,被这道三星的题目坑死!错误主要有以下:
(1)没有考虑有没有获得能力的边界,解决办法:开始都赋初值-1,非-1才表示能力达到,可操作。
(2)work2过程的参数弄错,主程序里的i和过程里的i混了…解决办法,添加参数x,y。
(3)f[i,j]表示第i分钟结束后,以j的能力值可以划的最多次数。在算课程的时候,我不小心把i当开始时间了。解决办法:+1
总之这题从昨天做死都做不出来查不出错,到看别人解题觉得和我自己的一样,到睡觉前想怎么解决到失眠,到今天早上物理课没心情听还在想…啊啊啊我的DP水平是有多糟糕啊…最后程序只有60-行
program usaco_;
type rec=record
start,last,level:integer;
end;
var l:array[..] of longint;
f:array[-..,..] of longint;
r:array[..] of rec;
mark:array[..] of boolean;
t,s,n,i,j,c,d,temp,ans,maxa:longint; procedure work2(x,y:integer);
var i:integer;
begin
for i:= to s do
if r[i].start=x+ then
if f[x,y]>f[x+r[i].last,r[i].level] then
f[x+r[i].last,r[i].level]:=f[x,y];
end; begin
fillchar(mark,sizeof(mark),false);
readln(t,s,n);
for i:= to s do
begin
readln(r[i].start,r[i].last,r[i].level);
if r[i].level>maxa then maxa:=r[i].level;
mark[r[i].start]:=true;
end;
for i:= to do
l[i]:=;
for i:= to n do
begin
readln(c,d);
if l[c]>d then l[c]:=d;
end;
for i:= to do
if l[i-]<l[i] then l[i]:=l[i-];
for i:= to t do
for j:= to maxa do
f[i,j]:=-;
f[,]:=;
for i:= to t do
for j:= to maxa do
begin
if f[i,j]<>- then
begin
if f[i,j]>f[i+,j] then f[i+,j]:=f[i,j];
if i+l[j]<=t then
if f[i,j]+>f[i+l[j],j] then f[i+l[j],j]:=f[i,j]+;
if mark[i+] then work2(i,j);
end;
end;
for j:= to do
if f[t,j]>ans then ans:=f[t,j];
writeln(ans);
end.
滑雪课程
P.S. 我拿到的题目的output里有注释,坑子的是这个注释竟然是错的!!正确的应该是3-4去上课,5-10在滑雪。
#8 滑雪比赛
终于没看解题,不过做的过程略脑残,一开始只想到转移方程的其一,后来才想到要判断,就是分(1)从T[i]到T[i+1]的路程没办法使速度从S[i]加到S[i+1] (2)从T[i]到T[i+1]的路程没办法使速度从S[i]降到S[i+1] 问题(1)写在转移方程的第二段里,(2)写在前面的预判里,直接对S数组进行处理。我相信还有别的处理方法,总之觉得自己写烦了。
还要注意有可能是通过重点的时候达到最大速度,再特判一个即可。
顺便0-0这真的是动归?我对我自己对DP的理解表示怀疑…第二章至此完美结束。
program usaco_;
var t,s,f:array[..+] of longint;
n,i,j,l,max,temp:longint;
procedure qsort(l,r:longint);
var i,j,mid,temp:longint;
begin
i:=l;j:=r;mid:=t[(l+r) div ];
repeat
while t[i]<mid do inc(i);
while t[j]>mid do dec(j);
if i<=j then
begin
temp:=t[i];t[i]:=t[j];t[j]:=temp;
temp:=s[i];s[i]:=s[j];s[j]:=temp;
inc(i);dec(j);
end;
until i>j;
if i<r then qsort(i,r);
if j>l then qsort(l,j);
end; begin
readln(l,n);
for i:= to n do
readln(t[i],s[i]);
qsort(,n);
for i:=n- downto do
if (s[i]-s[i+])>(t[i+]-t[i]) then
s[i]:=s[i+]+(t[i+]-t[i]);
t[]:=;s[]:=;f[]:=;
for i:= to n- do
begin
if (s[i+]-f[i])<=(t[i+]-t[i]) then
begin
temp:=trunc((t[i+]-t[i]+s[i+]+f[i])/);
f[i+]:=s[i+];
end
else
begin
temp:=f[i]+(t[i+]-t[i]);
f[i+]:=temp;
end;
if temp>max then max:=temp;
end;
if f[n]+(l-t[n])>max then max:=f[n]+(l-t[n]);
writeln(max);
end.
滑雪比赛
[USACO精选] 第二章 动态规划(一)的更多相关文章
- [USACO精选] 第一章 数值计算
好不容易坑来了传说中的USACO精选,近100题我要是能做完就哈哈哈哈了…继今天学并查集连番受挫之后,决定写一写基础题. #0 负二进制 2014-01-10 其实是想到就会做,不想到就不会做的题,数 ...
- (转)iOS Wow体验 - 第二章 - iOS用户体验解析(2)
本文是<iOS Wow Factor:Apps and UX Design Techniques for iPhone and iPad>第二章译文精选的第二部分,其余章节将陆续放出.上一 ...
- (转)iOS Wow体验 - 第二章 - iOS用户体验解析(1)
本文是<iOS Wow Factor:Apps and UX Design Techniques for iPhone and iPad>第二章译文精选的第一部分,其余章节将陆续放出.上一 ...
- ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第二章:利用模型类创建视图、控制器和数据库
在这一章中,我们将直接进入项目,并且为产品和分类添加一些基本的模型类.我们将在Entity Framework的代码优先模式下,利用这些模型类创建一个数据库.我们还将学习如何在代码中创建数据库上下文类 ...
- 《Django By Example》第二章 中文 翻译 (个人学习,渣翻)
书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:翻译完第一章后,发现翻译第二章的速 ...
- Jenkins入门系列之——02第二章 Jenkins安装与配置
2014-12-08:已不再担任SCM和CI的职位,Jenkins的文章如无必要不会再维护. 写的我想吐血,累死了. 网页看着不爽的,自己去下载PDF.有问题请留言! Jenkins入门系列之——03 ...
- Python黑帽编程 2.0 第二章概述
Python黑帽编程 2.0 第二章概述 于 20世纪80年代末,Guido van Rossum发明了Python,初衷据说是为了打发圣诞节的无趣,1991年首次发布,是ABC语言的继承,同时也是一 ...
- 《Entity Framework 6 Recipes》翻译系列 (3) -----第二章 实体数据建模基础之创建一个简单的模型
第二章 实体数据建模基础 很有可能,你才开始探索实体框架,你可能会问“我们怎么开始?”,如果你真是这样的话,那么本章就是一个很好的开始.如果不是,你已经建模,并在实体分裂和继承方面感觉良好,那么你可以 ...
- Asp.Net MVC4 + Oracle + EasyUI 学习 第二章
Asp.Net MVC4 + Oracle + EasyUI 第二章 --使用Ajax提升网站性能 本文链接:http://www.cnblogs.com/likeli/p/4236723.html ...
随机推荐
- POJ 3181 Dollar Dayz && Uva 147 Dollars(完全背包)
首先是 Uva 147:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_p ...
- golang学习之beego框架配合easyui实现增删改查及图片上传
golang学习之beego框架配合easyui实现增删改查及图片上传 demo目录: upload文件夹主要放置上传的头像文件,main是主文件,所有效果如下: 主页面: 具体代码: <!DO ...
- Winform_ComBox三种赋值方式
第一种方法: DataTable dt = new DataTable(); dt.Columns.Add( "name" ); dt.Columns.Add( "val ...
- VB6 GDI+ 入门教程[5] 基础绘图小结
http://vistaswx.com/blog/article/category/tutorial/page/2 VB6 GDI+ 入门教程[5] 基础绘图小结 2009 年 6 月 18 日 4条 ...
- GoF--命令设计模式
定义 将来自客户端的请求传入一个对象,从而使你可用不同的请求对客户进行参数化.用于“行为请求者”与“行为实现者”解耦,可实现二者之间的松耦合,以便适应变化.分离变化与不变的因素. 角色 Command ...
- JavaScript及C# URI编码详解
转载自:http://www.cnblogs.com/artwl/archive/2012/03/07/2382848.html 应用Uri编码,可以把一个或多个Uri作为另一个Uri的参数(如果不用 ...
- Qt之资源系统
简述 Qt 的资源系统用于存储应用程序的可执行二进制文件,它采用平台无关的机制.当你的程序总需要这样的一系列文件(图标.翻译文件等)并且不想冒丢失某些文件的风险时,这就显得十分有用. 资源系统基于 q ...
- python获取文件时间
import time, os create_time = time.ctime(os.path.getctime(filename)) modify_time = time.ctime(os.pat ...
- STL中vector的用法
vector是标准模板库的一种容器,是可存放各种类型的动态数组. #include<iostream> #include<vector> using namespace std ...
- Binary Tree Level Order Traversal [LeetCode]
Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, ...