【JZOJ】【DP】饥饿的WZK

60 篇文章 1 订阅

D e s c r i p t i o n Description Description

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

I n p u t Input Input

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

O u t p u t Output Output

一个数,最多能去多少

S a m p l e I n p u t Sample Input SampleInput
3	
1 3
7 8
3 4
S a m p l e O u t p u t Sample Output SampleOutput
5

思路

DP
B [ i ] B[i] B[i]排一遍
然后
F [ i ] = m a x ( 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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值