zoukankan      html  css  js  c++  java
  • HDU1176:免费馅饼(dp,数字三角形的应用)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1176

    这题就是数字三角行的变形,可惜对于我这个渣渣来说就是没发现,区别是他可以保持在三个点,他左边的点,右边的点,还有原点,

    从下往上处理。其他就没有什么好说的了,注意一下细节问题,我记得这题我白白贡献了几次WA.

    #include <iostream>
    #include <stdio.h>
    #include <string.h>
    #include <math.h>
    #include <algorithm>
    #define inf 0x3f3f3f3f
    typedef long long ll;
    using namespace std;
    int n,dp[12][100002],h[12][100002];
    int main()
    {
        int xx,yy,zan;
        while(scanf("%d",&n)!=EOF&&n!=0)
        {
            zan=-1;
            for(int i=0; i<11; i++)
            {
                for(int j=0; j<100001; j++)
                {
                    dp[i][j]=0;
                    h[i][j]=0;
                }
            }
            for(int i=0; i<n; i++)
            {
                scanf("%d%d",&xx,&yy);
                zan=max(zan,yy);
                h[xx][yy]++;
            }
            if(zan<=4)
            {
                for(int i=zan; i>=1; i--)
                {
                    for(int j=5-i; j<=5+i; j++)
                    {
                        dp[j][i]=max(dp[j][i],dp[j][i+1]+h[j][i]);
                        dp[j][i]=max(dp[j][i],dp[j-1][i+1]+h[j][i]);
                        dp[j][i]=max(dp[j][i],dp[j+1][i+1]+h[j][i]);
                    }
                }
                int sum=max(dp[4][1],dp[5][1]);
                sum=max(dp[6][1],sum);
                printf("%d
    ",sum);
                continue;
            }
            for(int i=zan; i>=5; i--)
            {
                for(int j=0; j<=10; j++)
                {
                    dp[j][i]=max(dp[j][i],dp[j][i+1]+h[j][i]);
                    if(j>=1)
                        dp[j][i]=max(dp[j][i],dp[j-1][i+1]+h[j][i]);
                    if(j<=9)
                        dp[j][i]=max(dp[j][i],dp[j+1][i+1]+h[j][i]);
                }
            }
            for(int i=4; i>=1; i--)
            {
                for(int j=5-i; j<=5+i; j++)
                {
                    dp[j][i]=max(dp[j][i],dp[j][i+1]+h[j][i]);
                    dp[j][i]=max(dp[j][i],dp[j-1][i+1]+h[j][i]);
                    dp[j][i]=max(dp[j][i],dp[j+1][i+1]+h[j][i]);
                }
            }
            int sum=max(dp[4][1],dp[5][1]);
            sum=max(dp[6][1],sum);
            printf("%d
    ",sum);
    
        }
        return 0;
    }
  • 相关阅读:
    solution for "cannot find vcvarsall.bat" in Python
    fast debug a program with GDB
    pLSA 浅析
    argsort in Python
    how to create html from tex source file
    google云输入法以及在chrome中的插件
    贝叶斯估计浅析
    JavaScript学习篇(5)
    JavaScript学习篇(6)
    JavaScript学习篇(2)
  • 原文地址:https://www.cnblogs.com/zhangmingcheng/p/4372791.html
Copyright © 2011-2022 走看看