//这道题可以转换成数塔问题
//将时间为纵轴,距离为横轴
//从上往下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;
}
hdu 1176
最新推荐文章于 2021-05-20 07:57:33 发布

228

被折叠的 条评论
为什么被折叠?



