HDU1024 多段最大和 DP

题目大意:

在n个数,求不重复的m段中的数据总和的最大值

令dp[i][j]表示将前j个数分成 i 段时得到的最大值(必取到第 j 个数)

状态转移可列为 dp[i][j]=Max(dp[i][j-1]+a[j] , Max( dp[i-1][k] ) + a[j] ) 0<k<j

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <string>
 4 #include <iostream>
 5 using namespace std;
 6
 7 const int N = 1000005;
 8 int a[N] , dp[N] , ans[N];
 9
10 int main()
11 {
12     int n , m;
13     while(scanf("%d%d" , &m , &n) == 2)
14     {
15         memset(dp , 0 , sizeof(dp));
16         memset(ans , 0 , sizeof(ans));
17         for(int i=1 ; i<=n ; i++){
18             scanf("%d" , a+i);
19         }
20         int maxn = -0x7fffffff;
21         for(int i=1 ; i<=m ; i++){
22             maxn = -0x7fffffff;
23             for(int j=i ; j<=n ; j++){
24                 dp[j] = max(dp[j-1] + a[j] , ans[j-1] + a[j]);
25                 ans[j-1] = maxn;
26                 maxn = max(dp[j] , maxn);
27             }
28         }
29         printf("%d\n" , maxn);
30     }
31     return 0;
32 }
时间: 2024-10-11 00:43:13

HDU1024 多段最大和 DP的相关文章

hdu1024 Max Sum Plus Plus (Dp)

hdu1024 Max Sum Plus Plus Now I think you have got an AC in Ignatius.L's "Max Sum" problem. To be a brave ACMer, we always challenge ourselves to more difficult problems. Now you are faced with a more difficult problem. Given a consecutive numbe

hdu1024(m段子段和最大)

链接:点击打开链接 题意:n个数分成m段不相交子段和最大 代码: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <iostream> #include <algorithm> using namespace std; const int INF=0x3f3f3f3f; int a[1000005],sum[1000005]; int dp[2][100000

多段图动态规划dp

多段图问题是DP的基础题目.大体的意思是有一个赋权有向图,其顶点集被分为几个子集.求经过每个子集从源点到终点的最短路径 1 import java.util.ArrayList; 2 import java.util.Arrays; 3 import java.util.Scanner; 4 import java.util.Stack; 5 6 public class Main { 7 private static final int k = 3; 8 private static int[

基础dp

队友的建议,让我去学一学kuangbin的基础dp,在这里小小的整理总结一下吧. 首先我感觉自己还远远不够称为一个dp选手,一是这些题目还远不够,二是定义状态的经验不足.不过这些题目让我在一定程度上加深了对dp的理解,但要想搞好dp,还需要多多练习啊. HDU - 1024 开场高能 给出一个数列,分成m段,求这m段的和的最大值,dp[i][j]表示遍历到第i个数,已经划分了j段,对于每一个数有两种决策,加入上一个区间段,自己成为一个区间段,故dp[i][j] = max(dp[i-1][j]+

DP问题各种模型的状态转移方程 (转)

1(最长公共子串(注意和最长公共子序列区别)) 两个字符串str1和str2,长度分别为(l1,l2) dp[i][j]表示以两个字符串分别以第i和第j个字符结尾所能达到的公共子序列的长度,由于下面涉及到i-1和j-1,那么这个时候我们一般从i=1和j=1开始到i<=len1, j<=len2. if(str[i-1]=str[j-1]) dp[i][j]=dp[i-1][j-1]+1; if(str[i-1]!=str[j-1]) dp[i][j]=0; 0 ;              

[转]DP问题各种模型的状态转移方程

1(最长公共子串(注意和最长公共子序列区别)) 两个字符串str1和str2,长度分别为(l1,l2) dp[i][j]表示以两个字符串分别以第i和第j个字符结尾所能达到的公共子序列的长度,由于下面涉及到i-1和j-1,那么这个时候我们一般从i=1和j=1开始到i<=len1, j<=len2. if(str[i-1]=str[j-1]) dp[i][j]=dp[i-1][j-1]+1; if(str[i-1]!=str[j-1]) dp[i][j]=0; 0 ;              

DP刷题记录

目录 dp刷题记录 codeforces 706C codeforces 940E BZOJ3997 POJ2279 GYM102082B GYM102082D codeforces132C L3-020 至多删三个字符 牛客 553C Chino with Queue POJ3260 The Fewest Coins Codeforces 372C dp刷题记录 codeforces 706C 题意:给出n个字符串,可以对每个字符串进行翻转操作, 每个操作对应一个消耗c[i],问经过操作后是否

hdu 1011 树形dp

Starship Troopers Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 16467    Accepted Submission(s): 4396 Problem Description You, the leader of Starship Troopers, are sent to destroy a base of t

HDU2167 Pebbles(状压DP)

题目给一张n×n的格子,每个格子都有数字,要从格子中取若干个数字,八个方向相邻的数字不能一起取,问取的数字最大和是多少. 从第一行一行一行看下去,可以发现第1行取哪几列只会影响到第2行,第3行后面的一点影响都没有.即第i行的决策只受i-1行决策的影响. 那么自然想到状态DP—— dp[i][S]前i行其中第i行取的列的集合是S的取数最大和 dp[i][S]=max(dp[i-1][S'])+集合S数字和(S是S'的合法的下一行的取法) 虽然题目n最多15,集合S就215种状态,但事实上合法的(不