HDU-1176免费馅饼

传送门:免费馅饼
分析:
1.t时刻,x坐标会掉落一块馅饼,要求到最后一秒时捡到的馅饼数目最多。这题属于动态规划内容。
2.因为初始位置已经固定了,所以从一开始推起不好推,我们不妨从后往前推,从最后一秒开始,接着,我们就要找到最后一秒和倒数第二秒的关系,即寻找状态方程,我们可以知道最后一秒的位置取决于前一秒的位置的状态,而前一秒位置有三种状态(保持不动or向前一步or向后一步),又因为要从后往前推,所以我们最后一秒的走路的最大值往前不断叠加,叠加到最初始的位置即为最优解了。

AC代码:

#include<iostream>
#include<cstring>
using namespace std;
int dp[100010][15];
int max(int a,int b,int c){
	int max1=a;
	if(b>max1)	max1=b;
	if(c>max1)	max1=c;
	return max1;
}
int main(){
	int n,x,t;
	while(~scanf("%d",&n)){
		if(n==0)	break;
		memset(dp,0,sizeof(dp));
		int max_t=0;
		for(int i=0;i<n;i++){
			scanf("%d%d",&x,&t);
			dp[t][x+1]++;			//每个位置的馅饼数记一下
			if(t>max_t)	max_t=t;
		}
		for(int i=max_t;i>=1;i--)
			for(int j=1;j<=11;j++)
				dp[i-1][j]+=max(dp[i][j],dp[i][j-1],dp[i][j+1]);		//状态转移方程
				cout<<dp[0][6]<<endl;
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_43556295/article/details/86635412