题目链接: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;
}
分享到:
相关推荐
1. **算法基础**:可能涉及到排序、搜索、图论、动态规划、贪心算法等基础算法。 2. **数据结构**:链表、树、栈、队列、哈希表、优先队列等可能被用来高效地处理问题。 3. **复杂度分析**:为了通过ACM的评测,解决...
描述中提到的“动态规划DP题解”和“POJ HDU部分动态规划DP题解”,说明这个压缩包包含了针对HDU和POJ(Problemset Online Judge)平台上一些动态规划题目的解答。POJ是一个著名的在线编程竞赛平台,其中包含了大量...
杭电hdu acm资料所用杭电的acm题
【标题】"HDU_2010.rar"是一个压缩包文件,其中包含了与"HDU 2010"相关的资源,特别是针对"HDU ACM20"比赛的编程题目。"hdu 2010"和"hdu 20"可能是该比赛的不同简称或分类,而"hdu acm20"可能指的是该赛事的第20届...
1. **算法基础**:这部分通常会讲解基础的数据结构,如数组、链表、栈、队列、树、图等,以及基础算法,如排序、搜索、动态规划、贪心算法等。这些是ACM竞赛中常遇到的问题类型,对解题至关重要。 2. **高级算法**...
hdu_2102_passed_sorce
【标题】"hdu.rar_HDU 1089.cpp_OJ题求和_hdu_horsekw5_杭电obj" 提供的信息是关于一个压缩文件,其中包含了一个名为 "HDU 1089.cpp" 的源代码文件,这个文件是为了解决杭州电子科技大学(Hangzhou Dianzi ...
3. **算法与数据结构**:HDU的题目通常涉及到基础和高级算法,如排序、搜索、图论、动态规划等,以及各种数据结构,如链表、树、堆、图等。通过分析这些源代码,可以学习到如何在实际问题中应用这些理论知识。 4. *...
HDU_ACM_1002_大数相加C源代码,利用字符串处理
杭电期中期末复习资料档案库_HDU_QuickLearner
【标题】"HDU_软工_计组实验1~8"所涵盖的知识点主要集中在计算机组织(简称计组)的实践操作层面,这通常包括对计算机硬件结构、指令系统、存储器体系、数据表示以及处理器工作原理等基础知识的深入理解和应用。...
2000到2099的题目范围,意味着这份资料涵盖了从基础数据结构如数组、链表,到基础算法如排序、搜索,再到更复杂的图论、动态规划等知识。这些题目设计巧妙,旨在锻炼参赛者的逻辑思维、问题解决和编程能力。对于准备...
在本压缩包文件“模式识别_hdu_期末复习资料集合_试卷笔记.zip”中,我们可以期待找到与杭州电子科技大学(HDU)模式识别课程相关的期末复习资料,可能包括过去的试卷、笔记和其他学习材料。 模式识别的基本概念...
B_(HDU_1231)(最大子段和,分治).cpp
2. **算法设计**:描述如何用计算机算法来实现游戏逻辑,可能涉及数据结构的选择(如队列、栈、图等)和算法(如搜索、动态规划等)。 3. **代码实现**:“san guo sha.cpp”中的具体代码,包括类设计、函数实现、...
【标题】"Rightmost Digit HDU" 这道题目来源于HDU(杭州电子科技大学)的在线判题系统,通常这类题目是编程竞赛或者算法训练的一部分。"Rightmost Digit"直译为“最右边的数字”,我们可以推测这是一个关于数字...
2. 算法选择:根据问题性质选择合适的算法,如动态规划、贪心算法、回溯法等。 3. 编程实现:清晰地组织代码,注重效率和可读性,避免不必要的复杂性。 4. 测试调试:利用样例测试用例进行初步验证,再逐步完善代码...
For a positive integer n, let’s denote function f(n,m) as the m-th smallest integer x that x>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)的学生准备的期末复习材料,包含了一些关于这门课程的试卷。下面,我们将详细探讨数字图像处理的一些核心知识点。 1. 图像...
通过阅读这些解题报告,用户可以了解到各种算法的应用,包括但不限于排序、搜索、图论、动态规划、回溯等经典算法。同时,还能了解到如何优化代码以满足ACM竞赛中的时间限制,以及如何有效地调试和验证程序的正确性...