码迷,mamicode.com
首页 > 其他好文 > 详细

【BZOJ 1270】 [BeijingWc2008]雷涛的小猫

时间:2015-01-28 09:47:23      阅读:201      评论:0      收藏:0      [点我收藏+]

标签:bzoj   oi   dp   

1270: [BeijingWc2008]雷涛的小猫

Time Limit: 50 Sec  Memory Limit: 162 MB
Submit: 956  Solved: 457
[Submit][Status]

Description

技术分享 技术分享

Input

技术分享

Output

技术分享

Sample Input

技术分享

Sample Output

8

HINT

技术分享


dp+优化。


dp方程很好想,f[i][j]表示走到第i个柱子高度为j的地方的能获得的最多柿子。


f[i][j]=max(f[i][j-1],f[k][j-d])+v[i][j]   (k为任意一根柱子)


发现f[k][j-d]只和j-d有关,和哪根柱子无关,记录ma[h]表示h高度获得的最多柿子。


f[i][j]=max(f[i][j-1],ma[j-d])+v[i][j]   


转移就变成O(1)的了。


#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cstdlib>
using namespace std;
int n,h,d,v[2005][2005],f[2005][2005],ma[2005];
int main()
{
        scanf("%d%d%d",&n,&h,&d);
	for (int i=1;i<=n;i++)
	{
		int x,y;
		scanf("%d",&x);
		for (int j=1;j<=x;j++)
			scanf("%d",&y),v[i][y]++;
	}
	int ans=0;
	for (int i=1;i<=n;i++)
		for (int j=0;j<d;j++)
			f[i][h-j]=v[i][h-j]+f[i][h-j+1],
			ma[h-j]=max(ma[h-j],f[i][h-j]),
			ans=max(ans,f[i][h-j]);
	for (int now=h-d;now;now--)
		for (int i=1;i<=n;i++)
			f[i][now]=max(f[i][now+1],ma[now+d])+v[i][now],
			ma[now]=max(ma[now],f[i][now]),
			ans=max(f[i][now],ans);
	cout<<ans<<endl;
	return 0;
}

技术分享

【BZOJ 1270】 [BeijingWc2008]雷涛的小猫

标签:bzoj   oi   dp   

原文地址:http://blog.csdn.net/regina8023/article/details/43206399

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!