还有贪心优化dp决策的操作……

Description

Farmer John 想要带着 Bessie 一起在科罗拉多州一起滑雪。很不幸,Bessie滑雪技术并不精湛。 Bessie了解到,在滑雪场里,每天会提供S(0<=S<=100)门滑雪课。第i节课始于M_i(1<=M_i<=10000),上的时间为L_i(1<=L_i<=10000)。上完第i节课后,Bessie的滑雪能力会变成A_i(1<=A_i<=100). 注意:这个能力是绝对的,不是能力的增长值。 Bessie买了一张地图,地图上显示了N(1 <= N <= 10,000)个可供滑雪的斜坡,从第i个斜坡的顶端滑至底部所需的时长D_i(1<=D_i<=10000),以及每个斜坡所需要的滑雪能力C_i(1<=C_i<=100),以保证滑雪的安全性。Bessie的能力必须大于等于这个等级,以使得她能够安全滑下。 Bessie可以用她的时间来滑雪,上课,或者美美地喝上一杯可可汁,但是她必须在T(1<=T<=10000)时刻离开滑雪场。这意味着她必须在T时刻之前完成最后一次滑雪。 求Bessie在实现内最多可以完成多少次滑雪。这一天开始的时候,她的滑雪能力为1.

Input

第1行:3个用空格隔开的整数:T, S, N。

第2~S+1行:第i+1行用3个空格隔开的整数来描述编号为i的滑雪课:M_i,L_i,A_i。

第S+2~S+N+1行:

第S+i+1行用2个空格隔开的整数来描述第i个滑雪坡:C_i,D_i。

Output

一个整数,表示Bessie在时间限制内最多可以完成多少次滑雪。

Sample Input

10 1 2
3 2 5
4 1
1 3

Sample Output

6

HINT

滑第二个滑雪坡1次,然后上课,接着滑5次第一个滑雪坡。


题目分析

显然是道dp题,不过这里讲下贪心优化决策。

其实这个名字可能有点太高大上了,它本质上就是通过预处理来减少复杂度。

有动态规划$f[i][j]$表示$i$时刻能力值为$j$能够滑雪的最多次数。

我们处理$l[i][j]$表示在$i$时刻结束的能力值为$j$的课程的最晚开始时间;$mins[i]$表示所需$1..i$能力值中用时最少的滑雪时间;$g[i]$表示$max\{f[i][j]\}$。

于是对于$f[i][j]$,有三种转移方式:

 f[i][j] = f[i-][j];
if (l[i-][j])
f[i][j] = std::max(f[i][j], g[l[i-][j]]);
if (i >= mins[j])
f[i][j] = std::max(f[i][j], f[i-mins[j]][j]+);

以上就是dp中的一块技巧,感觉还是非常有趣的。

 #include<bits/stdc++.h>
const int maxn = ;
const int maxc = ; int t,s,n;
int f[maxn][maxc],g[maxn],mins[maxc];
int l[maxn][maxc]; int read()
{
char ch = getchar();
int num = ;
bool fl = ;
for (; !isdigit(ch); ch = getchar())
if (ch=='-') fl = ;
for (; isdigit(ch); ch = getchar())
num = (num<<)+(num<<)+ch-;
if (fl) num = -num;
return num;
}
int main()
{
memset(mins, 0x3f3f3f3f, sizeof mins);
memset(f, -0x3f3f3f3f, sizeof f);
t = read(), s = read(), n = read();
for (int i=; i<=s; i++)
{
int x = read(), y = read(), z = read();
l[x+y-][z] = std::max(l[x+y-][z], x);
}
for (int i=; i<=n; i++)
{
int x = read(), y = read();
for (int j=x; j<maxc; j++)
mins[j] = std::min(mins[j], y);
}
f[][] = ;
for (int i=; i<=t; i++)
for (int j=; j<maxc; j++)
{
f[i][j] = f[i-][j];
if (l[i-][j])
f[i][j] = std::max(f[i][j], g[l[i-][j]]);
if (i >= mins[j])
f[i][j] = std::max(f[i][j], f[i-mins[j]][j]+);
g[i] = std::max(g[i], f[i][j]);
}
printf("%d\n",g[t]);
return ;
}

END

【贪心优化dp决策】bzoj1571: [Usaco2009 Open]滑雪课Ski的更多相关文章

  1. [bzoj1571][Usaco2009 Open]滑雪课Ski

    题目描述 Farmer John 想要带着 Bessie 一起在科罗拉多州一起滑雪.很不幸,Bessie滑雪技术并不精湛. Bessie了解到,在滑雪场里,每天会提供S(0<=S<=100 ...

  2. bzoj千题计划156:bzoj1571: [Usaco2009 Open]滑雪课Ski

    http://www.lydsy.com/JudgeOnline/problem.php?id=1571 DP不一定全部全状态转移 贪心的舍去一些不合法的反而更容易转移 在一定能力范围内,肯定滑雪所需 ...

  3. bzoj 1571: [Usaco2009 Open]滑雪课Ski【dp】

    参考:https://blog.csdn.net/cgh_andy/article/details/52506738 没有get到什么重点的dp--做的莫名其妙 注意滑雪一个坡可以滑很多次 设f[i] ...

  4. BZOJ 1571: [Usaco2009 Open]滑雪课Ski

    Description Farmer John 想要带着 Bessie 一起在科罗拉多州一起滑雪.很不幸,Bessie滑雪技术并不精湛. Bessie了解到,在滑雪场里,每天会提供S(0<=S& ...

  5. BZOJ——1571: [Usaco2009 Open]滑雪课Ski

    http://www.lydsy.com/JudgeOnline/problem.php?id=1571 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit:  ...

  6. 1571. [Usaco2009 Open]滑雪课Ski

    传送门 可以想到 $dp$,设 $f[i][j]$ 表示当前等级为 $i$,时间为 $j$ 的最大滑雪次数 显然上课不会上让自己等级降低的课,所以第一维 $i$ 满足无后效性 然后直接枚举 $i,j$ ...

  7. P1571: [Usaco2009 Open]滑雪课Ski

    DP. ; var t,s,n,i,j,m,l,a,c,d:longint; f,e:array[..,..maxn] of longint; q:array[..] of longint; g:ar ...

  8. 【BZOJ】1571: [Usaco2009 Open]滑雪课Ski

    [算法]动态规划 [题解]yy出了O(1w log 1w)的算法. 将雪坡排序预处理出g[i]表示能力值为i的最短时长雪坡. 这样就可以定义work(t,c)表示时长t能力c的最多滑雪数量,work( ...

  9. [USACO2009 OPEN] 滑雪课 Ski Lessons

    洛谷P2948 看到题目就觉得这是动规但一直没想到如何状态转移……看了别人的题解之后才有一些想法 f[i][j]:前i单位时间能力值为j可以滑的最多次数 lessons[i][j]:结束时间为i,获得 ...

随机推荐

  1. Luogu P1514引水入城【搜索】 By cellur925

    题目传送门 这道题开始看好像并没有什么思路,和搜索好像也并没有什么关系.但是我们手玩下样例就会发现,思路其实就三句话:(写这道题的时候在代码里写的) //我们想知道从第1行的每列往下到干旱区的范围 / ...

  2. ES6入门系列二(数值的扩展)

    ES6 在 Number对象上新增了很多方法 1 .    Number.isFinite()判断是否为有限的数字 和全局的isFinite() 方法的区别是 isFinite('1') === tr ...

  3. B. Lecture Sleep( Educational Codeforces Round 41 (Rated for Div. 2))

    前缀后缀和搞一搞,然后枚举一下区间,找出最大值 #include <iostream> #include <algorithm> using namespace std; ; ...

  4. PostgreSQL-7-数据连接

    1.通过WHERE进行简单连接 SELECT * FROM company3,department  不添加WHERE将会显示所有数据 SELECT * FROM company3,departmen ...

  5. django_logging

    django使用python自带的logging打印日志 logging 是线程安全的,其主要由4部分组成: Logger 用户使用的直接接口,将日志传递给Handler Handler 控制日志输出 ...

  6. EM算法(徐亦达)笔记

  7. ZROI #365. 【2018普转提day18专题】嘤嘤嘤嘤

    ZROI #365. [2018普转提day18专题]嘤嘤嘤嘤 直接放代码 具体做法见注释 #include<stdio.h> #include<cstring> #inclu ...

  8. oratop

    1.下载: 目前,Oratop是在MOS上免费下载.每个db 版本和 os 版本都有对应的程序:The tool is a compiled c program. 不需要编译,直接运行.   (下载文 ...

  9. 083 Remove Duplicates from Sorted List 有序链表中删除重复的结点

    给定一个排序链表,删除所有重复的元素使得每个元素只留下一个.案例:给定 1->1->2,返回 1->2给定 1->1->2->3->3,返回 1->2- ...

  10. D - 連結 / Connectivity 并查集

    http://abc049.contest.atcoder.jp/tasks/arc065_b 一开始做这题的时候,就直接蒙逼了,n是2e5,如果真的要算出每一个节点u能否到达任意一个节点i,这不是f ...