`
Coco_young
  • 浏览: 125782 次
  • 性别: Icon_minigender_1
  • 来自: 湖南长沙
社区版块
存档分类
最新评论

[动态规划]HDU_1024_MaxSum Plus Plus

 
阅读更多

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1024

题目大意:略

状态为:dp(i,j),表示包含a[j]的前j个数划分成i段时的最大值。

基本的状态转移方程为:dp(i,j) = max{dp(i,j-1)+a[j],max{dp(i-1,k)}+a[j]}, 1<=i<=m, i<=j<=n, i-1<=k<j

如何理解上述状态转移方程:dp(i,j-1)+a[j],表示第i段包含住a[j],(a[j]不是第j段的开头),max{dp(i-1,k)}+a[j],表示第i段以a[j]为开头。

上述方法的时间复杂度为 O(mn^2),因为转移的复杂度达到了O(n)

这里要进行优化,借鉴网上的方法,再增设状态,f(i,j)表示由a[1]-a[j]分成i段获得的最大值,可以不包含a[j]

那么状态转移方程可以改为: dp(i,j) = max{dp(i,j-1),f(i-1,j-1)}+a[j], 其中max{dp(i-1,k)} 等价于f(i-1,j-1),那么状态的转移就优化到了O(1),然后可以得出f(i,j) = max{f(i,j-1),dp(i,j)}

如何理解:第一个方程很简单,就是一个等价的代换,第二个方程,f(i,j-1)表示f(i,j)表示由a[1]-a[j-1]分成i段获得的最大值,而dp(i,j)表示包含a[j]的前j个数划分成i段时的最大值,

而这正好是f(i,j)的所有可能取值情况中的最大值。

空间复杂度的优化,实际上可以观察到dp(i,j)要依靠的子问题只有dp(i,j-1),那么可以把dp(i,j)降到一维,同样f(i,j)也只需要一维,不过实现的时候要注意,dp还不要紧,但是f要等到dp更新完再更新,并且在dp开始更新时,f[i-1]要赋值为负无穷,这样才能保证f[i-1]是正确的值(因为加入的a[i]可以是负数).

总结:边界的处理要仔细推敲。

代码:

#include<iostream>
using namespace std;
const int MAXN = 1000010,inf=0x3fffffff;
int f[MAXN],dp[MAXN],a[MAXN];
int main()
{
    int m,n;
    while(scanf("%d%d",&m,&n)!=EOF)
    {
        for(int i=1;i<=n;i++)scanf("%d",&a[i]);
        memset(f,0,sizeof(f));dp[0]=0;f[0]=-inf;
        for(int i=1;i<=m;i++)
        {
            f[i-1] = -inf;
            for(int j=i;j<=n;j++)
            {
                if(j==i)dp[j] = dp[j-1]+a[j];
                else
                {
                    dp[j] = dp[j-1]>f[j-1]?dp[j-1]:f[j-1];
                    dp[j] += a[j];
                }
            }
            for(int j=i;j<=n;j++)
            {
                f[j] = f[j-1]>dp[j]?f[j-1]:dp[j];
            }
            //for(int j=1;j<=n;j++)printf("%d ",dp[j]);cout<<endl;
            //for(int j=1;j<=n;j++)printf("%d ",f[j]);cout<<endl;
        }
        printf("%d\n",f[n]);
    }
    return 0;
}


分享到:
评论

相关推荐

    hdu_acm_1084.rar_ACM_HDU10_acm10_hdu_hdu 1084

    1. **算法基础**:可能涉及到排序、搜索、图论、动态规划、贪心算法等基础算法。 2. **数据结构**:链表、树、栈、队列、哈希表、优先队列等可能被用来高效地处理问题。 3. **复杂度分析**:为了通过ACM的评测,解决...

    DP.rar_DP_hdu_动态规划_动态规划 C++

    描述中提到的“动态规划DP题解”和“POJ HDU部分动态规划DP题解”,说明这个压缩包包含了针对HDU和POJ(Problemset Online Judge)平台上一些动态规划题目的解答。POJ是一个著名的在线编程竞赛平台,其中包含了大量...

    hdu_ACM.rar_ACM_hdu_hdu acm_hdu_ACM_杭电ACM

    杭电hdu acm资料所用杭电的acm题

    HDU_2010.rar_hdu 2010_hdu 20_hdu acm20

    【标题】"HDU_2010.rar"是一个压缩包文件,其中包含了与"HDU 2010"相关的资源,特别是针对"HDU ACM20"比赛的编程题目。"hdu 2010"和"hdu 20"可能是该比赛的不同简称或分类,而"hdu acm20"可能指的是该赛事的第20届...

    HDU_ACM培训课件(完整版)

    1. **算法基础**:这部分通常会讲解基础的数据结构,如数组、链表、栈、队列、树、图等,以及基础算法,如排序、搜索、动态规划、贪心算法等。这些是ACM竞赛中常遇到的问题类型,对解题至关重要。 2. **高级算法**...

    hdu_2102_passed

    hdu_2102_passed_sorce

    hdu.rar_HDU 1089.cpp_OJ题求和_hdu_horsekw5_杭电obj

    【标题】"hdu.rar_HDU 1089.cpp_OJ题求和_hdu_horsekw5_杭电obj" 提供的信息是关于一个压缩文件,其中包含了一个名为 "HDU 1089.cpp" 的源代码文件,这个文件是为了解决杭州电子科技大学(Hangzhou Dianzi ...

    HDU.rar_hdu_hdu07_com_shownv9b_www.563hdu.

    3. **算法与数据结构**:HDU的题目通常涉及到基础和高级算法,如排序、搜索、图论、动态规划等,以及各种数据结构,如链表、树、堆、图等。通过分析这些源代码,可以学习到如何在实际问题中应用这些理论知识。 4. *...

    HDU_ACM_1002_大数相加C源代码

    HDU_ACM_1002_大数相加C源代码,利用字符串处理

    杭电期中期末复习资料档案库_HDU_QuickLearner.zip

    杭电期中期末复习资料档案库_HDU_QuickLearner

    HDU_软工_计组实验1~8

    【标题】"HDU_软工_计组实验1~8"所涵盖的知识点主要集中在计算机组织(简称计组)的实践操作层面,这通常包括对计算机硬件结构、指令系统、存储器体系、数据表示以及处理器工作原理等基础知识的深入理解和应用。...

    HDU.rar_hdoj 2000 2999 chm_hdoj 2000-2099_hdu_hdu acm 20_杭电ACM

    2000到2099的题目范围,意味着这份资料涵盖了从基础数据结构如数组、链表,到基础算法如排序、搜索,再到更复杂的图论、动态规划等知识。这些题目设计巧妙,旨在锻炼参赛者的逻辑思维、问题解决和编程能力。对于准备...

    模式识别_hdu_期末复习资料集合_试卷笔记.zip

    在本压缩包文件“模式识别_hdu_期末复习资料集合_试卷笔记.zip”中,我们可以期待找到与杭州电子科技大学(HDU)模式识别课程相关的期末复习资料,可能包括过去的试卷、笔记和其他学习材料。 模式识别的基本概念...

    B_(HDU_1231)(最大子段和,分治).cpp

    B_(HDU_1231)(最大子段和,分治).cpp

    sanguosha.rar_hdu_三国杀_标程

    2. **算法设计**:描述如何用计算机算法来实现游戏逻辑,可能涉及数据结构的选择(如队列、栈、图等)和算法(如搜索、动态规划等)。 3. **代码实现**:“san guo sha.cpp”中的具体代码,包括类设计、函数实现、...

    Rightmost Digit_hdu_

    【标题】"Rightmost Digit HDU" 这道题目来源于HDU(杭州电子科技大学)的在线判题系统,通常这类题目是编程竞赛或者算法训练的一部分。"Rightmost Digit"直译为“最右边的数字”,我们可以推测这是一个关于数字...

    hdu-page-11-answer.rar_hdu_hdu oj第十一页_page_搜题_杭电oj

    2. 算法选择:根据问题性质选择合适的算法,如动态规划、贪心算法、回溯法等。 3. 编程实现:清晰地组织代码,注重效率和可读性,避免不必要的复杂性。 4. 测试调试:利用样例测试用例进行初步验证,再逐步完善代码...

    code_hdu.rar_ACM_The First_hdu_test case example

    For a positive integer n, let’s denote function f(n,m) as the m-th smallest integer x that x&gt;n and gcd(x,n)=1. For example, f(5,1)=6 and f(5,5)=11. You are given the value of m and (f(n,m)?...

    数字图像处理_hdu_期末复习资料_试卷等.zip

    这个压缩包“数字图像处理_hdu_期末复习资料_试卷等.zip”显然是为杭州电子科技大学(HDU)的学生准备的期末复习材料,包含了一些关于这门课程的试卷。下面,我们将详细探讨数字图像处理的一些核心知识点。 1. 图像...

    hangdianACM.rar_hangdiana_hdu acm_www.hangdianacm_杭电

    通过阅读这些解题报告,用户可以了解到各种算法的应用,包括但不限于排序、搜索、图论、动态规划、回溯等经典算法。同时,还能了解到如何优化代码以满足ACM竞赛中的时间限制,以及如何有效地调试和验证程序的正确性...

Global site tag (gtag.js) - Google Analytics