/*
http://acm.hdu.edu.cn/showproblem.php?pid=1176
与数塔是一样的
f[i][j] = get_max(f[i + 1][j], f[i + 1][j + 1], f[i + 1][j - 1]) + f[i][j]
*/
#include <stdio.h>
#include <string.h>
long long dp[100010][15];
int main()
{
int n;
while(scanf("%d",&n) && n)
{
memset(dp,0,sizeof(dp));
int i;
int p,t,maxt=0;
for(i=0; i<n; i++)
{
scanf("%d %d",&p,&t);
dp[t][p+1]++; //空出 0 的位置 方便下面 数组操作不会越界, t 是 大于 0的
if(t>maxt) maxt=t;
}
for(i=maxt-1; i>0; i--) // 这里 不用 i>=0 因为 t 是 大于 0的
{
int j;
for(j=1; j<=11; j++)
{
long long max=0;
max = dp[i+1][j-1] > dp[i+1][j]?dp[i+1][j-1]:dp[i+1][j]; //这里j-1不会数组越界,因为j>=1
if(dp[i+1][j+1] > max)
max = dp[i+1][j+1];
dp[i][j] += max;
}
}
//t 是 大于 0的 所以 比较的是 dp[1] 这一行
long long m = dp[1][5]>dp[1][6]?dp[1][5]:dp[1][6];// 0空出, 原来 5 的位置 现在是 6
if(dp[1][7]>m) m = dp[1][7];
printf("%I64d\n",m);
}
return 0;
}
1176 免费馅饼
最新推荐文章于 2022-01-27 17:34:04 发布