一个人初始在位置5,能接到自己位置,+1位置,-1位置其中一个的馅饼,位置只有0到10,一次移动1个位置,求最多馅饼。现在看来,完全是数塔的翻版,从后向前推。
dp[i][j]=max(dp[i+1][j],max(dp[i+1][j-1],dp[i+1][j+1]))+dp[i][j];
位置为0或10的时候特判一下就好了。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
struct Node{
int x;
int time;
}node[100005];
int max(int a, int b)
{
return a > b ? a : b;
}
int dp[100005][12];
int main()
{
int i, j, m, n, ans, pre, pos, tim;
while (scanf("%d", &n) != EOF)
{
if (!n)break;
for (i = 1; i <= n; i++)
{
scanf("%d%d", &node[i].x, &node[i].time);
if (i == 1)
pre = node[i].time;
else
pre = max(pre, node[i].time);
}
for (i = 0; i <= pre;i++)
for (j = 0; j <= 10; j++)
dp[i][j] = 0;
for (i = 1; i <= n; i++)
{
pos = node[i].x;
tim = node[i].time;
dp[tim][pos]++;
}
for (i = pre-1; i >= 0; i--)
{
for (j = 0; j <= 10; j++)
{
if (j == 0)
dp[i][j] = max(dp[i + 1][j], dp[i + 1][j + 1]) + dp[i][j];
else if (j == 10)
dp[i][j] = max(dp[i + 1][j], dp[i + 1][j - 1]) + dp[i][j];
else
dp[i][j] = max(dp[i + 1][j], max(dp[i + 1][j + 1], dp[i + 1][j - 1])) + dp[i][j];
}
}
//for (i = 0; i <= pre; i++)
//{
// for (j = 0; j <= 10; j++)
// cout << dp[i][j] << " ";
// cout << endl;
//}
cout << dp[0][5] << endl;
}
return 0;
}