zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    Socket通信
    浏览器调用打印机
    python dict操作
    python list操作
    python 模块Example链接
    python random模块
    python configparser模块
    python unittest模块
    python timeit模块
    python datetime模块
  • 原文地址:https://www.cnblogs.com/jiangjing/p/2991392.html
Copyright © 2011-2022 走看看