[luoguP2948] [USACO09OPEN]滑雪课Ski Lessons(DP)

传送门

f[i][j]表示i时刻能力值为j的最大滑雪数

显然f[0][1]=0,开始搜索

三种转移:

①美美的喝上一杯**:f[i+1][j]=max(f[i+1][j],f[i][j])

②滑雪,f[i+当前能力值所能滑雪最短时间][j]=max(f[i+当前能力值所能滑雪最短时间][j],f[i][j])

③上课,对于所有i时刻开始的课,f[i+该课所需时间][该课达到能力值]=max(f[i+该课所需时间][该课达到能力值],f[i][j])

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 100001
#define max(x, y) ((x) > (y) ? (x) : (y))
#define min(x, y) ((x) < (y) ? (x) : (y))

int t, s, n, ans, mx = 1;
int val[N], f[N][101];
//val[i]表示滑雪能力为i时一次滑雪的最低耗时
//f[i][j]表示时间为i,滑雪能力为j所能滑的最多次数 

struct ovo
{
	int m, l, a;
}q[N];

struct qwq
{
	int c, d;
}p[N];

inline int read()
{
	int x = 0, f = 1;
	char ch = getchar();
	for(; !isdigit(ch); ch = getchar()) if(ch == ‘-‘) f = -1;
	for(; isdigit(ch); ch = getchar()) x = (x << 1) + (x << 3) + ch - ‘0‘;
	return x * f;
}

inline bool cmp(qwq x, qwq y)
{
	return x.c < y.c;
}

int main()
{
	int i, j;
	t = read();
	s = read();
	n = read();
	for(i = 1; i <= s; i++)
	{
		q[i].m = read();
		q[i].l = read();
		q[i].a = read();
	}
	for(i = 1; i <= n; i++)
	{
		p[i].c = read();
		p[i].d = read();
	}
	std::sort(p + 1, p + n + 1, cmp);
	j = 1;
	val[0] = 1e9;
	for(i = 1; i <= 100; i++)
	{
		val[i] = val[i - 1];
		for(; i == p[j].c && j <= n; j++) val[i] = min(val[i], p[j].d);
	}
	memset(f, -1, sizeof(f));
	f[0][1] = 0;
	for(i = 0; i <= t; i++)
	{
		mx = -1;
		for(j = 1; j <= 100; j++)
		{
			f[i + 1][j] = max(f[i + 1][j], f[i][j]);
			if(f[i][j] != -1 && val[j] != 1e9)
			{
				mx = max(mx, f[i][j]);
				f[i + val[j]][j] = max(f[i + val[j]][j], f[i][j] + 1);
			}
		}
		for(j = 1; j <= s; j++)
			if(mx != -1 && i >= q[j].m)
				f[i + q[j].l][q[j].a] = max(f[i + q[j].l][q[j].a], mx);
	}
	for(i = 1; i <= 100; i++) ans = max(ans, f[t][i]);
	printf("%d\n", ans);
	return 0;
}

  

时间: 2024-10-13 00:15:30

[luoguP2948] [USACO09OPEN]滑雪课Ski Lessons(DP)的相关文章

BZOJ 1571: [Usaco2009 Open]滑雪课Ski

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买了一张地图,

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

http://www.lydsy.com/JudgeOnline/problem.php?id=1571 DP不一定全部全状态转移 贪心的舍去一些不合法的反而更容易转移 在一定能力范围内,肯定滑雪所需时间越少越好 当课程的结束时间和能力值改变相同时,肯定课程越晚开始越好 预处理 late[i][j] 表示结束时间为i,能力值变成j的课程的最晚开始时间 mi[i] 表示在滑雪能力值<=i时,滑一次雪所需的最短时间 dp[i][j] 表示时间i,能力值为j时,最多的滑雪次数 f[i] 表示时间i最多

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

[算法]动态规划 [题解]yy出了O(1w log 1w)的算法. 将雪坡排序预处理出g[i]表示能力值为i的最短时长雪坡. 这样就可以定义work(t,c)表示时长t能力c的最多滑雪数量,work(t,c)=t/g[c]. 然后将课程按结束时间排序. f[i]=f[j]+work(a[i].begin-a[j].end,g[a[j].c]). #include<cstdio> #include<cstring> #include<algorithm> #include

P1571: [Usaco2009 Open]滑雪课Ski

DP. 1 const maxn=10001; 2 var t,s,n,i,j,m,l,a,c,d:longint; 3 f,e:array[0..100,0..maxn] of longint; 4 q:array[0..100] of longint; 5 g:array[0..maxn] of longint; 6 function max(a,b:longint):longint; 7 begin 8 if a>b then exit(a) 9 else exit(b); 10 end;

bzoj1571 [Usaco2009 Open]滑雪课Ski

传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1571 [题解] 动态规划,设f[i,j]表示第i天能力值为j最多滑几个坡 可以不滑.选个耗时最小的破滑(预处理),或者学习. 复杂度O(TS*100) 可以把那个S优化掉. # include <stdio.h> # include <string.h> # include <iostream> # include <algorithm> // # i

poj1088 滑雪(dfs、dp优化)

#include <iostream> #include <map> #include <string> #include <cstdio> #include <sstream> #include <cstring> #include <vector> #include <cmath> #define N 110 int a,b,step=0; int anw=0; int moun[N][N]; int dp

bzoj 1571: [Usaco2009 Open]滑雪课

http://www.lydsy.com/JudgeOnline/problem.php?id=1571 dp[i][j]表示前i个时间,能力为j所能达到得最大滑雪次数 预处理出,需要能力$<=c$的滑坡滑行的最少时间的坡花费的时间 dp转移,三种情况 1 喝coco汁 2 滑雪 3 学习课程 具体看代码 #include<cstdio> #include<cstring> #include<algorithm> const int maxn = 10007; i

bzoj usaco 金组水题题解(1)

UPD:我真不是想骗访问量TAT..一开始没注意总长度写着写着网页崩了王仓(其实中午的时候就时常开始卡了= =)....损失了2h(幸好长一点的都单独开了一篇)....吓得赶紧分成两坨....TAT.............. —————————————————————————————————————————————————————————————————————————————— 写(被虐)了整整一个月b站上usaco的金组题...然而到现在总共只写了100道上下TAT(当然是按AC人数降序排

【USACO】DP动态规划小测(一)

{20160927 19:30~21:30} 总分400分,我113.33,稳稳地垫底了......(十分呼应我上面的博客名,hhh~)过了这么多天我才打完所有代码,废话我也就不多说了.不过,虽然时间花费的多,但我觉得我的PG也是“博采众长”了. ------------------------------------------------------------------------------------------------------------------------------