• HDU1176免费馅饼(DP)


    跳到原题

    解题报告:

    首先这题相当于数字三角形。

    相当于从(0,5)出发,求到达底端的最大值

    (i, 0) , (i, 10)这两个端点是要注意的,因为(i,0)只能到达(i+1, 0) 和 (i+1, 1), 而(i, 10)只能到达(i+1, 9), (i+1, 10)

    #include <stdio.h>
    #include <string.h>
    
    #define MAXN 100010
    
    int dp[MAXN][12];
    
    int max_num(int a, int b, int c){
        a = a > b ? a : b;
        a = a > c ? a : c;
        return a;
    }
    
    int main(){
        int n, m, i, j, x, t;
        while(scanf("%d", &n) == 1 && n){
            memset(dp, 0, sizeof(dp));
            m = 0;
            for(i=0; i<n; i++){
                scanf("%d %d", &x, &t);
                dp[t][x]++;
                if(m < t) m = t;
            }
            for(i=m-1; i>=0; i--){
                dp[i][0] += dp[i+1][0] > dp[i+1][1] ? dp[i+1][0] : dp[i+1][1];
                for(j=1; j<=10; j++){
                    dp[i][j] += max_num(dp[i+1][j-1], dp[i+1][j], dp[i+1][j+1]);
                }
            }
            printf("%d\n", dp[0][5]);
        }
    
        return 0;
    }

    如果将题目给出的数据

    6

    5 1

    4 1

    6 1

    7 2

    7 2

    3

    0

    输出dp便能轻易看出其中的道理

  • 相关阅读:
    dom4j 创建XML文件
    Convert.ToInt32()与int.Parse()的区别
    委托
    工厂模式
    策略模式
    大型网站架构演化
    字符串反转(面试)
    switch(面试)
    带宽计算
    新语法
  • 原文地址:https://www.cnblogs.com/tanhehe/p/2909454.html
Copyright © 2020-2023  润新知