hdu 1176(一道简单的dp)

题意:很容易理解...

思路:可以说是数塔(hdu 2084)的类似题,做这个题得时候我们可以先画个图,在第0秒的时候在5位置,第一秒的时候可以在4,5,6位置然后依次类推,然后很容易观察出问题的解法了,其实从上往下推和从下往上推都可以,只不过从下往上推要好做一点,这里我给出了两种方法的解题代码。

代码实现:

#include<stdio.h>//从下往上推的
#include<string.h>
int a[100005][15],dp[100005][15];
int nima(int i,int j)
{
    int x1,x2,x3,temp;
    x1=j-1;x2=j;x3=j+1;
    if(x1<0)
        x1=0;
    if(x3>10)
        x3=10;
    temp=dp[i+1][x1]>dp[i+1][x2]?dp[i+1][x1]:dp[i+1][x2];
    return temp>dp[i+1][x3]?temp:dp[i+1][x3];
}
int main()
{
    int n,i,j,max,t1,t2,f,r;
    while(scanf("%d",&n)!=EOF&&n)
    {
        max=-1;
        memset(a,0,sizeof(a));
        memset(dp,0,sizeof(dp));
        for(i=1;i<=n;i++)
        {
            scanf("%d%d",&t1,&t2);
            dp[t2][t1]++;
            if(t2>max)
                max=t2;
        }
        for(i=max-1;i>=0;i--)
        {
            if(i>=5)
            {
                for(j=0;j<=10;j++)
                    dp[i][j]+=nima(i,j);
            }
            else
            {
                f=5-i;r=5+i;
                for(j=f;j<=r;j++)
                    dp[i][j]+=nima(i,j);
            }
        }
        printf("%d\n",dp[0][5]);
    }
    return 0;
}
#include<stdio.h>//从上往下推的
#include<string.h>
int dp[100005][15],a[100005][15];
int nima(int i,int j,int f,int r)
{
    int x1,x2,x3,temp;
    x1=j-1;x2=j;x3=j+1;
    if(x1>=f&&x1<=r)
        temp=dp[i-1][x1]>dp[i-1][x2]?dp[i-1][x1]:dp[i-1][x2];
    else
        temp=dp[i-1][x2];
    if(x3>=f&&x3<=r)
        temp=dp[i-1][x3]>temp?dp[i-1][x3]:temp;
    return temp;
}
int main()
{
    int n,i,j,max,t1,t2,f1,r1,f2,r2,kao;
    while(scanf("%d",&n)!=EOF&&n)
    {
        max=-1;kao=-1;
        memset(a,0,sizeof(a));
        memset(dp,0,sizeof(dp));
        for(i=1;i<=n;i++)
        {
            scanf("%d%d",&t1,&t2);
            a[t2][t1]++;
            if(t2>max)
                max=t2;
        }
        dp[0][5]=a[0][5];f1=5;r1=5;
        for(i=1;i<=max;i++)
        {
            if(i<=5)
            {
                f2=5-i;r2=5+i;
                for(j=f2;j<=r2;j++)
                {
                    dp[i][j]=a[i][j]+nima(i,j,f1,r1);
                    if(dp[i][j]>kao)
                        kao=dp[i][j];
                }
                f1=f2;
                r1=r2;
            }
            else
            {
                f1=0;r1=10;
                for(j=0;j<=10;j++)
                {
                    dp[i][j]=a[i][j]+nima(i,j,f1,r1);
                    if(dp[i][j]>kao)
                        kao=dp[i][j];
                }
            }
        }
        printf("%d\n",kao);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/jiangjing/p/2991392.html