题意:在接下来的一段时间里,馅饼都掉落在0-10这11个位置。开始时gameboy站在5这个位置,因此在第一秒,他只能接到4,5,6这三个位置中其中一个位置上的馅饼。问gameboy最多可能接到多少个馅饼?(假设他的背包可以容纳无穷多个馅饼)
链接:HDU 1176传送门
思路:可以发现是一个变形的数塔问题,设置一个二维数组,二维数组的第i行第j列代表在第i秒有馅饼落在位置j。做法与数塔类似,最终结果是dp[0][5]的值。不过dp[i][0]的值只能从dp[i+1][0]与dp[i+1][1]中获取,dp[i][10]的值从dp[i+1][10]与dp[i+1][9]中获取。
代码:
for(int i=0; i<n; i++)
{
cin>>a>>b;
num[b][a]++;
}
for(int i=100000;i>=0;i--)
{
for(int j=1;j<=9;j++)
dp[i][j]=MAX(dp[i+1][j-1],dp[i+1][j],dp[i+1][j+1])+num[i][j];
dp[i][0]=max(dp[i+1][0],dp[i+1][1])+num[i][0];
dp[i][10]=max(dp[i+1][9],dp[i+1][10])+num[i][10];
}
cout << dp[0][5] << endl;
心得:转化为熟悉的类型