免费馅饼 HDU - 1176

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Miranda_ymz/article/details/79948831

免费馅饼 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;
} 
阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页