现在的位置: 首页 > 综合 > 正文

hdu 1176

2013年08月13日 ⁄ 综合 ⁄ 共 835字 ⁄ 字号 评论关闭
//这道题可以转换成数塔问题
//将时间为纵轴,距离为横轴
//从上往下DP
//DP[i][j] = max{DP[i+1][j-1],DP[i+1][j],DP[i+1][j+1]} + a[i][j]
//吐槽一下,WA了很多次,原因是max函数写错了尼玛啊啊
#include <stdio.h>
#include <string.h>
#define max(a,b) a>b?a:b 

int n;
int a[100001][11];
int DP[100001][11];

int max1(int a,int b,int c)
{
	int max2;
	max2 = a > b?a:b;
	max2 = max2 > c?max2:c;
	return max2;
}

int main()
{
	while(scanf("%d",&n) != EOF)
	{
		if( n == 0)
			break;
		int x,T;
		memset(a,0,sizeof(a));
		memset(DP,0,sizeof(DP));
		int max_T = 0;
		for(int i = 0; i < n; i++)
		{
			scanf("%d%d",&x,&T);
			a[T][x] ++;
			DP[T][x] = a[T][x];
			if(T > max_T)
			{
				max_T = T;
			}
		}
                
                for(int i = 0; i <= 10; i++)
                {
                      DP[max_T][i] = a[max_T][i];
                }
                for(int i = max_T-1; i >= 0; i--)
		{
			for(int j = 1; j <= 9; j++)
			{
				DP[i][j] = max1(DP[i+1][j-1],DP[i+1][j+1],DP[i+1][j]) + a[i][j];
			}
			DP[i][0] = max(DP[i+1][0],DP[i+1][1]) + a[i][j];
			DP[i][10] = max(DP[i+1][9],DP[i+1][10]) + a[i][j];
		}
		printf("%d\n",DP[0][5]);
	}
	return 0;
}

抱歉!评论已关闭.