本文主要是介绍ACM DP 免费馅饼,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目:
为了使问题简化,假设在接下来的一段时间里,馅饼都掉落在0-10这11个位置。开始时gameboy站在5这个位置,因此在第一秒,他只能接到4,5,6这三个位置中其中一个位置上的馅饼。问gameboy最多可能接到多少个馅饼?(假设他的背包可以容纳无穷多个馅饼)
Output每一组输入数据对应一行输出。输出一个整数m,表示gameboy最多可能接到m个馅饼。
提示:本题的输入数据量比较大,建议用scanf读入,用cin可能会超时。
Sample Input
6 5 1 4 1 6 1 7 2 7 2 8 3 0Sample Output
4
题意:
给出馅饼掉落的时间和位置,以及主任最初在的位置,一次只能接住该位置以及周围1的馅饼,同时1s只能移动1,求出最多可以得到的馅饼书
分析:
既然是在DP的分类专题,首先想到的就是写递归方程,但是会有一个问题,那就是随着时间的增加,主人可以到达的位置会变化,呈现倒三角形式,因此会很麻烦,所以自然想到倒着来,用dp[i][j]表示i时间在j位置可以得到的最多馅饼数;
代码:
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
int a[100002][11];
int dp[100002][11];
int main()
{
int n,x,t,time,i,j;
while(scanf("%d",&n)!=EOF)
{
time=0;
memset(a,0,sizeof(a));
memset(dp,0,sizeof(dp));
if(n==0) break;
for(i=0;i<n;i++)
{
scanf("%d %d",&x,&t);
a[t][x]++;
if(time<t)
time=t;//计算出最后的时间用作总时间
}
for(i=time;i>=0;i--)
{
for(j=0;j<11;j++)//其实应该是运气好吧,这里我直接认定了最后的时间一定可以到达所有的地方的,但是AC了
{
if(j>=1&&j<=9)
dp[i][j]=max(dp[i+1][j],max(dp[i+1][j-1],dp[i+1][j+1]))+a[i][j];
else if(j==0)
dp[i][j]=max(dp[i+1][j],dp[i+1][j+1])+a[i][j];
else
dp[i][j]=max(dp[i+1][j],dp[i+1][j-1])+a[i][j];
}
}
printf("%d\n",dp[0][5]);
}
return 0;
}
这篇关于ACM DP 免费馅饼的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!