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

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;
}

时间: 2024-08-03 14:18:33

【BZOJ 1270】 [BeijingWc2008]雷涛的小猫的相关文章

bzoj 1270: [BeijingWc2008]雷涛的小猫 简单dp+滚动数组

1270: [BeijingWc2008]雷涛的小猫 Time Limit: 50 Sec  Memory Limit: 162 MB[Submit][Status][Discuss] Description   Input Output Sample Input Sample Output 8 HINT 思路:保存i+z的max值:上一行的dp值: #include<bits/stdc++.h> using namespace std; #define ll __int64 #define

BZOJ 1270: [BeijingWc2008]雷涛的小猫( dp )

简单的dp.. dp(i,j) = max(dp(x,y))+cnt[i][j], (x,y)->(i,j)是合法路径. 设f(i)= max(dp(x,y))(1≤x≤N, 1≤y≤i), g(i,j) = max(dp(i, k))(1≤k≤j) 那么dp(i,j) =  max(f(j+delta), g(i,j+1))+cnt[i][j]. 递推即可. 时间复杂度O(NH) ---------------------------------------------------------

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

题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1270 看到题面上的PKU宿舍,又让我怀念起七月份在PKU上课的那段快乐时光... 这也许是WC的送分题吧,比较简单的动规,但是也很巧妙.用f1[i]表示小猫在高度i时得到的柿子个数最大值,f2[i]表示在当前高度上,小猫在第i根柱子上得到的柿子个数最大值. 然后高度从高到低遍历,维护f1.f2即可. #include <iostream> #include <stdio.

1270: [BeijingWc2008]雷涛的小猫

1270: [BeijingWc2008]雷涛的小猫 Time Limit: 50 Sec  Memory Limit: 162 MBSubmit: 905  Solved: 430[Submit][Status] Description   Input Output Sample Input Sample Output 8 HINT Source 题解:额..这个嘛...首先声明——此程序在BZOJ上交每次都莫名其妙的RE,但是我要到数据后在window下测评怎么测都没出问题,额,求各位也帮我

bzoj1270 [BeijingWc2008]雷涛的小猫

题目链接 我真是DP弱者想了半天...h1[i]记录当前在第i棵树的最大值(滚动数组),h2[i]记录高度在i时的最大值这两个数组可以交替更新 1 #include<algorithm> 2 #include<iostream> 3 #include<cstdlib> 4 #include<cstring> 5 #include<cstdio> 6 #include<string> 7 #include<cmath> 8

【bzoj1270】[BeijingWc2008]雷涛的小猫 dp

题目描述   输入 输出 样例输入 样例输出 8 题解 dp 设f[i][j]表示在第i棵树的j高度时最多吃到的柿子数. 那么只有两种可能能够到达这个位置:滑下来.跳下来. 滑下来直接用f[i][j+1]转移,跳下来需要在dp同时记录一个g数组,g[j]表示j高度时最多的柿子数,这样可以用g[j+D]转移. 然后跑dp即可. #include <cstdio> #include <algorithm> #define N 2010 using namespace std; int

【动态规划】bzoj1270 [BeijingWc2008]雷涛的小猫

暴力dp是n^2*m的……我们计算每棵树在每层的答案的时候,都需要计算出从那棵树转移过来最优. 但是我们发现,对一棵树而言,从上面转移过来都是一样的,所以我们可以在计算每棵树在每层的答案的时候,先预处理出它应该从上面何处转移过来,消掉一个n. 1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 #define N 2001 5 int delta,n,h,m,a[N][N],f[N][N],ans; 6

入门动态规划 BZOJ 1270 雷涛的小猫

1270: [BeijingWc2008]雷涛的小猫 Time Limit: 50 Sec  Memory Limit: 162 MBSubmit: 1250  Solved: 643[Submit][Status][Discuss] Description   Input Output Sample Input Sample Output 8 HINT 这个题已经水得不能再水了,然而我还是WA了几次 1 #include<iostream> 2 #include<cstdio>

[BeijingWc2008][BZOJ1270] 雷涛的小猫|动态规划

1270: [BeijingWc2008]雷涛的小猫 Time Limit: 50 Sec  Memory Limit: 162 MBSubmit: 1002  Solved: 481[Submit][Status][Discuss] Description   Input Output Sample Input Sample Output 8 HINT Source 唉……第一遍写了个超暴力dp直接跑完了50s. f1,f2分别表示 高度为i的最大值,当前高度在第i棵上最大值. #includ