zoukankan      html  css  js  c++  java
  • hdu-1176(dp)

    解题思路:用dp做的,dp[i][j]表示在i时刻,j点的最大馅饼。a[i][j]表示在i这个时刻j点同时掉落的馅饼;

    每个点除了0和10之外,都有三种状态;

    1、没有移动,这样值就为dp[i][j]=max(dp[i][j],dp[i-1][j]+a[i][j]);

    2、从左边移动来的,dp[i][j]=max(dp[i][j],dp[i-1][j-1]+a[i][j]);

    3、从右边移动来的,dp[i][j]=max(dp[i][j],dp[i-1][j+1]+a[i][j]);

    初始化dp[i][j]=-1;dp[0][5]=0;本身在5这个点;

    #include<iostream>
    #include<algorithm>
    #include<cstdio>
    #include<cstring>
    #define maxn 100005
    using namespace std;
    int dp[maxn][12];
    int a[maxn][12];
    int n;
    int main()
    {
        int x,t;
        while(scanf("%d",&n)!=EOF)
        {
            if(n==0)
                return 0;
            memset(dp,-1,sizeof(dp));
            memset(a,0,sizeof(a));
            while(n--)
            {
               scanf("%d%d",&x,&t);
               a[t][x]++;
            }
            int ans=-888;
            dp[0][5]=0;
            for(int i=1;i<=100000;i++)//时间;
            {
                for(int j=0;j<=10;j++)//地点;
                {
                    if(dp[i-1][j]!=-1)
                        dp[i][j]=max(dp[i][j],dp[i-1][j]+a[i][j]);
                        if(j!=0&&dp[i-1][j-1]!=-1)
                            dp[i][j]=max(dp[i][j],dp[i-1][j-1]+a[i][j]);
                        if(j!=10&&dp[i-1][j+1]!=-1)
                            dp[i][j]=max(dp[i][j],dp[i-1][j+1]+a[i][j]);
                    ans=max(ans,dp[i][j]);
                }
            }
            printf("%d
    ",ans);
        }
        return 0;
    }
    

      

  • 相关阅读:
    Snuke's Subway Trip
    codevs 1606 台阶
    COGS 2334. [HZOI 2016]最小函数值
    codevs 1052 地鼠游戏
    洛谷 P1091 合唱队形
    洛谷 P1376 机器工厂
    codevs 2618 核电站问题
    vijos 1524 最小监视代价
    洛谷 P1690 贪婪的Copy
    51nod 1135 原根
  • 原文地址:https://www.cnblogs.com/huangdao/p/8570084.html
Copyright © 2011-2022 走看看