1. 程式人生 > >hdu-1176(dp)

hdu-1176(dp)

== 同時 scanf ret pri 移動 blog OS div

解題思路:用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\n",ans);
    }
    return 0;
}

  

hdu-1176(dp)