一道很明显的dp题,和数塔之和最大差不多,要考虑在端点处的情况。
题意:都是中文,很好理解。
附上代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int dp[100005][11];
int max1(int a,int b,int c) //三个数中找到最大值
{
a=a>b?a:b;
return a>c?a:c;
}
int max2(int a,int b) //两个数中找到最大值
{
return a>b?a:b;
}
int main()
{
int n,m,x,T,i,j;
while(~scanf("%d",&n)&&n)
{
memset(dp,0,sizeof(dp)); //dp数组全部初始化为0
int max=0;
for(i=1; i<=n; i++)
{
scanf("%d%d",&x,&T);
dp[T][x]++; //T时间在x位置掉一块馅饼则加1
if(max<T) //max=最后掉馅饼的时间
max=T;
}
for(i=max; i>=1; i--) //从下往上推
{
for(j=1; j<10; j++)
dp[i-1][j]+=max1(dp[i][j],dp[i][j+1],dp[i][j-1]); //如果不是两端点,则在下一行的三个相邻点中找到最大的值往上推
dp[i-1][0]+=max2(dp[i][0],dp[i][1]); //在两端点则只能在两个相邻点中选最大值
dp[i-1][10]+=max2(dp[i][10],dp[i][9]);
}
printf("%d\n",dp[0][5]); //输出0秒5位置的最大馅饼数
}
return 0;
}