【JZOJ】【DP】饥饿的WZK

本文探讨了一个经典的动态规划问题——菜篮子问题。在一个有n个窗口的环境中,每个窗口提供一系列不可重复选取的菜品。目标是通过有效的算法,在不违反规则的情况下,最大化获取的菜品数量。文章详细解释了如何使用动态规划来解决这个问题,并提供了一个具体的实现代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

DescriptionDescriptionDescription

有n个窗口
你想在这n个窗口中取菜
你可以在A[i]A[i]A[i]~B[i]B[i]B[i]中取菜
取了就必须把所有的取了
但是你不能重复在某个窗口取菜
问最多可以去多少菜

InputInputInput

一个数,m
第2~m+1行,每行两个数,A[i]A[i]A[i]B[i]B[i]B[i]

OutputOutputOutput

一个数,最多能去多少

SampleInputSample InputSampleInput
3	
1 3
7 8
3 4
SampleOutputSample OutputSampleOutput
5

思路

DP
B[i]B[i]B[i]排一遍
然后
F[i]=max(F[i−1],F[A[j]−1]+(B[j]−A[j]+1))F[i]=max(F[i-1],F[A[j]-1]+(B[j]-A[j]+1))F[i]=max(F[i1],F[A[j]1]+(B[j]A[j]+1))

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
struct whw
{
	int Start,End;
}A[2250];
int F[2250];
int n,m;
bool Nm(whw i,whw j)
{return i.End<j.End;}
int main()
{
//	freopen("hunger.in","r",stdin);
//	freopen("hunger.out","w",stdout);
	scanf("%d",&m);
	for(int i=1;i<=m;++i)
	{
		scanf("%d%d",&A[i].Start,&A[i].End);
		n=max(n,A[i].End);
	}
	sort(A+1,A+m+1,Nm);//排序
	for(int i=A[1].End;i<=n;++i)
	{
		F[i]=F[i-1];//
		for(int j=1;j<=m;++j)
		{
			if(A[j].End>i)break;//如果超过了
			F[i]=max(F[i],F[A[j].Start-1]+(A[j].End-A[j].Start+1));
		}
	}
	printf("%d",F[n]);
	fclose(stdin);
	fclose(stdout);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值