• POJ #2479


    Hi, I'm back.

    This is a realy classic DP problem to code. 

    1. You have to be crystal clear about what you are going to solve.
    2. Apparently there are 2 DP sections
    3. Think carefully about recurrence relations
    5. Details: take care of indices boundaries - it costed me 1hr to find an indexing bug!
    6. Again: think crystal clear before you code!

    And, #2593 is exactly the same. 

    Here is my AC code:

     1 #include <stdio.h>
     2 
     3 #define MAX_INX 50010
     4 #define Max(a,b) (a)>(b)?(a):(b)
     5 
     6 int max_sum2(int *pData, int cnt)
     7 {
     8     //    DP: Max sum of sub-sequence: dp[i] = MAX(num[i], dp[i-1] + num[i])
     9 
    10     //    Left -> Right
    11     int  lt[MAX_INX] = { 0 };    
    12     lt[0] = pData[0];
    13     for (int i = 1; i < cnt; i ++)
    14     {
    15         lt[i] = Max(pData[i], lt[i - 1] + pData[i]);
    16     }
    17     
    18     //    Right -> Left
    19     int   rt[MAX_INX] = { 0 };
    20     int     rtm[MAX_INX] = { 0 };
    21     rt[cnt-1] = pData[cnt-1];
    22     for (int i = cnt-2; i >= 0; i--)
    23     {
    24         rt[i] = Max(pData[i], rt[i + 1] + pData[i]);
    25     }
    26     rtm[cnt-1] = rt[cnt-1];
    27     for (int i = cnt-2; i >=0; i--)
    28     {        
    29         rtm[i] = Max(rtm[i+1], rt[i]);
    30     }
    31 
    32     //    O(n) to find real max
    33     int ret = -10010;
    34     for (int i = 0; i < cnt - 1; i ++)
    35     {
    36         ret = Max(ret, lt[i] + rtm[i+1]);
    37     }
    38 
    39     return ret;
    40 }
    41 
    42 int main()
    43 {    
    44     int nTotal = 0; 
    45     scanf("%d", &nTotal);
    46 
    47     while (nTotal--)
    48     {
    49         int num[MAX_INX] = { 0 };
    50         
    51         //    Get Input
    52         int nCnt = 0; scanf("%d", &nCnt);        
    53         for (int i = 0; i < nCnt; i ++)
    54         {
    55             scanf("%d", num + i);
    56         }
    57         
    58         printf("%d
    ", max_sum2(num, nCnt));
    59     }
    60 
    61     return 0;
    62 }
    View Code
  • 相关阅读:
    Managing C++ Objects: 管理C++对象 —— 一些建议准则
    像Java一样管理对象:T&形式仅仅用在参数传递
    Visual Studio的语法着色终于调得赏心悦目
    j.u.c: Java并发包的5大块
    笔记:Java Language Specification
    线程与锁
    分布式系统涉及的基本问题
    微服务为什么是一种趋势
    js实现复制功能
    css label两端对齐
  • 原文地址:https://www.cnblogs.com/tonix/p/3792916.html
Copyright © 2020-2023  润新知