版权声明:那个,最起码帮我加点人气吧,署个名总行吧 https://blog.csdn.net/qq_41670466/article/details/83478179
思路:对于dp之类的题来说最重要的就是转移方程的建立吧,在这道题中我们可以得知人要想到达x点,他只能从x+1处,x-1处或者x处原地不动来到达,那么转移方程也就同样建立起来,唯一需要注意的一点大概就是对于0和10这两个临界点的处理。
代码:
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn = 1e5 + 10;
int num[maxn][11];
int dp[maxn][11];//dp[I][j]表示的是第I秒到达j点时的所装的馅饼数
int main()
{
int n;
while (scanf("%d", &n) && n)
{
int mx = 0;
memset(dp, 0, sizeof(dp));
memset(num, 0, sizeof(num));
for(int i=0;i<n;i++)
{
int a, t;
scanf("%d %d", &a, &t);
if (t == 1 && (a == 4 || a == 6||a==5))
dp[1][a]++;
num[t][a]++;
mx = mx > t ? mx : t;
}
for (int i = 2; i <=mx; i++)
{
for (int j = 0; j < 11; j++)
{
if (j == 0)
dp[i][j] = max(dp[i - 1][0], dp[i - 1][1]) + num[i][0];
else if (j == 10)
dp[i][10] = max(dp[i - 1][10], dp[i - 1][9]) + num[i][10];
else
dp[i][j] = max(dp[i - 1][j - 1], max(dp[i - 1][j], dp[i - 1][j + 1])) + num[i][j];
}
}
int mt = 0;
for (int i = 0; i < 11; i++)
mt = mt > dp[mx][i] ? mt : dp[mx][i];
printf("%d\n", mt);
}
//system("pause");
return 0;
}