hdu 1176 免费馅饼

拉拉拉拉拉拉~~~~~~~dp水水~~~~~~~~~~~~

好不容易AC之后,看status,发现这题被zzuli的小盆友们集体虐过,ORZ。。。


这题开始想得有问题,没考虑中间间隔时间大的话肿么样。今晚想了想,改成按时间DP,因为当前时间的状态只和上一秒状态有关。

所以直接用上一秒相邻两个以及自己(忘了这个,WA了几次)状态更新即可。当然,开始的时候需要存下馅饼的时间,地点,如果5可以到达的话,那么更新的时候加上去即可。

虽然很水,但是还是蛮开心的~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~大笑

#include <queue>
#include <stack>
#include <math.h>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <limits.h>
#include <string.h>
#include <string>
#include <algorithm>
#define MID(x,y) ( ( x + y ) >> 1 )
#define L(x) ( x << 1 )
#define R(x) ( x << 1 | 1 )
#define BUG puts("here!!!")

using namespace std;

const int MAX = 100010;
const int MAX_N = 15;
int dp[MAX_N][MAX];
int tt[MAX_N][MAX];
int main()
{
	int n,x,t;
	while( ~scanf("%d",&n) && n )
	{
		memset(dp, 0, sizeof(dp));
		memset(tt, 0, sizeof(tt));
		int max_t = 0;
		for(int i=0; i<n; i++)
		{
			scanf("%d%d",&x,&t);
			max_t = max(max_t, t);
			tt[x][t]++;
		}	
		
		int ans = 0;
		
		for(int i=1; i<=max_t; i++)
			for(int k=0; k<=10; k++)
			{
				int t = dp[k][i-1];
				if( k >= 1 ) t = max(t, dp[k-1][i-1]);
				if( k <= 9 ) t = max(t, dp[k+1][i-1]);
				
				dp[k][i] = t;
				
				if( tt[k][i] && i >= abs(k-5) )
					dp[k][i] += tt[k][i];
				
				ans = max(ans, dp[k][i]);
			}

		printf("%d\n",ans);
	}
	
return 0;
}


评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值