hdu1024 最大m子序列和
题意:
给你一个序列n个数组成,然后让你在里面找到m个子序列,让这m个子序列的和最大。
思路:
dp[i][j]表示的是第j个数字在第i个子序列时的当前最优值。
dp[i][j] = maxx(dp[i][j-1] + num[j] ,maxx(dp[i-1][k]) + num[j]); k是从1到j-1.
可以这么理解这个转移方程,对于当前的这个数字,如果把他放到第i个子序列中有两种情况,一个是他作为第i个子序列的第一个数字,另一个就是不作为第一个数字,作为第一个数字的时候是 maxx(dp[i-2][k] + num[j]) 1<=k<i 的意思是从之前的所有中找到i-1个子序列的最大值+当前的值,不做为第一个的时候那么他前面的那个数字一定是i序列的,同一个子序列,又不是作为第一个,那么前面的那个货就一定是同一个子序列的,那么当前的值是dp[i][j-1]
+ num[j],在两种决策中选择一个最有的就行了,还有就是maxx(dp[i-1][k]+num[j])的这个地方可以开一个数组记录下来,不能每次都跑,跑不起,再有就是这个题目没有给m的范围,所以开不了二维数组(目测不是很大,大的话会超时,但是肯定是先超内存在超时,所以为了保险,还是吧dp[][]压缩成一维的)那么状态转移就边成这样了dp[j]表示的是 j这个人在当前的这个子序列中的最优值,mk[j]表示的是在上一个子序列中1--j的dp的最大值,所以就变成 dp[j] = maxx(dp[j-1] +
num[j] ,mk[j-1]+num[j]);还是 max(作为i个子序列的第一个元素,不是第一个元素取一个最大值)。在解释下代码的核心部分。
__int64 Max
for(i = 1 ;i <= m ;i ++) //枚举子序列
{
Max = - INF;
for(j = i ;j <= n ;j ++) //j = i是因为每个子序列最少1个元素
{
if(i == j) dp[j] = mk[j-1] + num[j];//第i个元素只能是第i个子序列的第一个
else
dp[j] = maxx(dp[j-1] ,mk[j-1]) + num[j];
mk[j-1] = Max; //这个地方注意了,不能更新mk[j],只能更新j-1因为更新j就会被当前的这个子序列更新的时候用到。
if(Max < dp[j]) Max = dp[j];
}
}
最后直接输出Max就行了,因为里面保存的正好是第m个子序列中最大的那个。
#include<stdio.h>
#include<string.h> #define N 110000
#define INF 922337203685477580
__int64 num[N] ,dp[N] ,mk[N]; __int64 maxx(__int64 x ,__int64 y)
{
return x > y ? x : y;
} int main ()
{
int n ,m ,i ,j;
while(~scanf("%d %d" ,&m ,&n))
{
for(i = 1 ;i <= n ;i ++)
scanf("%I64d" ,&num[i]);
memset(dp ,0 ,sizeof(dp));
memset(mk ,0 ,sizeof(mk));
__int64 Max;
for(i = 1 ;i <= m ;i ++)
{
Max = -INF;
for(j = i ;j <= n ;j ++)
{
if(i == j) dp[j] = mk[j-1] + num[j];
else
dp[j] = maxx(dp[j-1] ,mk[j-1]) + num[j];
mk[j-1] = Max;
if(Max < dp[j]) Max = dp[j];
}
}
printf("%I64d\n" ,Max);
}
return 0;
}
hdu1024 最大m子序列和的更多相关文章
- 最大m段子段和
hdu1024 最大m子序列和 给定你一个序列,让你求取m个子段(不想交的子段)并求取这m个子段和的最大值 从二维开始来看dp[i][j]表示取第j个数作为第i个子段的元素所得到的前i个子段和的最大值 ...
- 用python实现最长公共子序列算法(找到所有最长公共子串)
软件安全的一个小实验,正好复习一下LCS的写法. 实现LCS的算法和算法导论上的方式基本一致,都是先建好两个表,一个存储在(i,j)处当前最长公共子序列长度,另一个存储在(i,j)处的回溯方向. 相对 ...
- codevs 1576 最长上升子序列的线段树优化
题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...
- [LeetCode] Arithmetic Slices II - Subsequence 算数切片之二 - 子序列
A sequence of numbers is called arithmetic if it consists of at least three elements and if the diff ...
- [LeetCode] Is Subsequence 是子序列
Given a string s and a string t, check if s is subsequence of t. You may assume that there is only l ...
- [LeetCode] Wiggle Subsequence 摆动子序列
A sequence of numbers is called a wiggle sequence if the differences between successive numbers stri ...
- [LeetCode] Increasing Triplet Subsequence 递增的三元子序列
Given an unsorted array return whether an increasing subsequence of length 3 exists or not in the ar ...
- [LeetCode] Distinct Subsequences 不同的子序列
Given a string S and a string T, count the number of distinct subsequences of T in S. A subsequence ...
- 动态规划之最长公共子序列(LCS)
转自:http://segmentfault.com/blog/exploring/ LCS 问题描述 定义: 一个数列 S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则 ...
随机推荐
- POJ-3660(Floyd算法)
Cow Contest POJ-3660 1.本题考察的是最短路,用的算法是Floyd算法 2.如果一个结点和剩余的n-1个结点都有关系,那么可以确定其排名 3.需要注意的是,判断是否有关系时,反向关 ...
- OpenCV计算机视觉学习(13)——图像特征点检测(Harris角点检测,sift算法)
如果需要处理的原图及代码,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice 前言 ...
- AtCoder Beginner Contest 192
A Star #include <cstdio> using namespace std; int n; int main() { scanf("%d", &n ...
- FreeBSD WIFI 配置
ee /boot/ loader.conf ee是个编辑器 中写入 rtwn_usb_load="YES" legal.realtek.license_ack=1 在 /etc/ ...
- Java流程控制:用户交互Scanner
java.util.Scanner工具类获取用户输入语法:Scanner scanner = new Scanner(System.in);通过Scanner类的next()与nextLine()方法 ...
- bjd_ctf
1.抓包修改 提示修改id,postman修改headers里面的id 分析得到id是admin加admin的base64编码,payload为id: adminYWRtaW4= 请求后又提示请使 ...
- Python中的描述器
21.描述器:Descriptors 1)描述器的表现 用到三个魔术方法.__get__() __set__() __delete__() 方法签名如下: object.__get__(self ...
- 3.DataFrame的增删改查
以此为例 一.DataFrame的初步认知 在pandas中完成数据读取后数据以DataFrame保存.在操作时要以DataFrame函数进行了解 函数 含义 示例 values 元素 index 索 ...
- 14、MyBatis教程之全部(包括所有章节)
MyBatis 3.5.5 教程 1.环境准备 jdk 8 + MySQL 5.7.19 maven-3.6.1 IDEA 学习前需要掌握: JDBC MySQL Java 基础 Maven Juni ...
- 使用 dynamic 类型让 ASP.NET Core 实现 HATEOAS 结构的 RESTful API
上一篇写的是使用静态基类方法的实现步骤: http://www.cnblogs.com/cgzl/p/8726805.html 使用dynamic (ExpandoObject)的好处就是可以动态组 ...