免费馅饼 HDU - 1176
原创
©著作权归作者所有:来自51CTO博客作者DeathYmz的原创作品,请联系作者获取转载授权,否则将追究法律责任
免费馅饼 HDU - 1176
思路:想要从上一秒的位置判断可以去哪里。每一刻,每个位置。方程就是dp[k][i+1]=max(dp[k][i+1],dp[j][i]+a[k][i+1]);
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn=100000+10;
int dp[11][maxn];//时间和位置的
int a[11][maxn];
int main()
{
int n;
int t,x;
int t_max;
while(~scanf("%d",&n)&&n)
{
t_max=0;
memset(a,0,sizeof(a));
memset(dp,-1,sizeof(dp)) ;
for(int i=0;i<n;i++)
{
scanf("%d%d",&x,&t);
t_max=max(t,t_max);//最大的时间
a[x][t]++;//t,时刻某点有的馅饼数目
}
dp[5][0]=0;
for(int i=0;i<=t_max;i++)
{
for(int j=0;j<11;j++)
{
if(dp[j][i]==-1) continue;//i时刻都不在这里
for(int k=0;k<11;k++)
{
if(k>j+1||k<j-1) continue;//之前这里加了一个a[k+1][i]==0,WA了后来想想可能也不需要这个把,虽然没有馅饼但是可以去更多的馅饼那里
dp[k][i+1]=max(dp[k][i+1],dp[j][i]+a[k][i+1]);
}
}
}
int ans=-1;
for(int i=0;i<11;i++)
ans=max(dp[i][t_max],ans);
printf("%d\n",ans);
}
return 0;
}