数列两段的最大字段和

POJ2479

Maximum sum

Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 41231 Accepted: 12879

Description

Given a set of n integers: A={a1, a2,..., an}, we define a function d(A) as below:

Your task is to calculate d(A).

Input

The input consists of T(<=30) test cases. The number of test cases (T) is given in the first line of the input.

Each test case contains two lines. The first line is an integer n(2<=n<=50000). The second line contains n integers: a1, a2, ..., an. (|ai| <= 10000).There is an empty line after each case.

Output

Print exactly one line for each test case. The line should contain the integer d(A).

Sample Input

1

10
1 -1 2 2 3 -3 4 -4 5 -5

Sample Output

13

Hint

In the sample, we choose {2,2,3,-3,4} and {5}, then we can get the answer.

Huge input,scanf is recommended.

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm> using namespace std;
const int maxn = 50000+7; int t,n,arr[maxn],sum;
int a[maxn],b[maxn]; int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
for(int i = 1; i <= n ; i++ ) {
scanf("%d",&arr[i]);
}
a[1] = arr[1];
for(int i = 2; i <= n; i ++ ) {
if(a[i-1]<0)
a[i]=arr[i];
else
a[i]= a[i-1]+arr[i];
}
for(int i = 2; i <= n; i ++ ) {
a[i] = max(a[i-1],a[i]);
}
/*********************************/
b[n] = arr[n];
for(int i = n-1; i >= 1; i -- ) {
if(b[i+1]<0)
b[i]=arr[i];
else
b[i]= b[i+1]+arr[i];
}
for(int i = n-1; i >= 1; i -- ) {
b[i] = max(b[i+1],b[i]);
}
int ans = -999999999;
for(int i = 2; i <= n; i ++ ) {
ans = max(a[i-1]+b[i],ans);
}
printf("%d\n",ans);
} return 0;
}

最长公共上升子序列

POJ1458

Common Subsequence

Time Limit: 1000MS Memory Limit: 10000K
Total Submissions: 53882 Accepted: 22384

Description

A subsequence of a given sequence is the given sequence with some elements (possible none) left out. Given a sequence X = < x1, x2, ..., xm > another sequence Z = < z1, z2, ..., zk > is a subsequence of X if there exists a strictly increasing sequence < i1, i2, ..., ik > of indices of X such that for all j = 1,2,...,k, xij = zj. For example, Z = < a, b, f, c > is a subsequence of X = < a, b, c, f, b, c > with index sequence < 1, 2, 4, 6 >. Given two sequences X and Y the problem is to find the length of the maximum-length common subsequence of X and Y.

Input

The program input is from the std input. Each data set in the input contains two strings representing the given sequences. The sequences are separated by any number of white spaces. The input data are correct.

Output

For each set of data the program prints on the standard output the length of the maximum-length common subsequence from the beginning of a separate line.

Sample Input

abcfbc         abfcab
programming contest
abcd mnp

Sample Output

4
2
0
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm> using namespace std;
const int maxn = 1e3+7; char str[maxn],ttr[maxn];
int dp[maxn][maxn]; int main()
{
while(~scanf("%s %s",str+1,ttr+1))
{
int n = strlen(str+1);
int m = strlen(ttr+1);
memset(dp,0,sizeof(dp));
dp[1][1] = str[1] == ttr[1];
for(int i = 1; i <= n; i ++ ) {
for(int j = 1; j <= m ; j ++ ) {
if(i == 1 && j == 1) {
continue;
}
if(str[i] == ttr[j]) {
dp[i][j] = dp[i-1][j-1]+1;
}
else {
dp[i][j] = max(dp[i-1][j],dp[i][j-1]);
}
}
}
printf("%d\n",dp[n][m]);
}
return 0;
}

最长上升子序列

POJ2533

Longest Ordered Subsequence

Time Limit: 2000MS Memory Limit: 65536K
Total Submissions: 53931 Accepted: 24094

Description

A numeric sequence of ai is ordered if a1 < a2 < ... < aN. Let the subsequence of the given numeric sequence (a1, a2, ..., aN) be any sequence (ai1, ai2, ..., aiK), where 1 <= i1 < i2 < ... < iK <= N. For example, sequence (1, 7, 3, 5, 9, 4, 8) has ordered subsequences, e. g., (1, 7), (3, 4, 8) and many others. All longest ordered subsequences are of length 4, e. g., (1, 3, 5, 8).

Your program, when given the numeric sequence, must find the length of its longest ordered subsequence.

Input

The first line of input file contains the length of sequence N. The second line contains the elements of sequence - N integers in the range from 0 to 10000 each, separated by spaces. 1 <= N <= 1000

Output

Output file must contain a single integer - the length of the longest ordered subsequence of the given sequence.

Sample Input

7
1 7 3 5 9 4 8

Sample Output

4
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm> using namespace std;
const int maxn = 1005; int n,arr[maxn],dp[maxn]; int main()
{
while(~scanf("%d",&n))
{
for(int i =1 ; i <= n ; i ++ ) {
scanf("%d",&arr[i]);
dp[i] = 1;
}
for(int i = 1 ; i <= n ; i ++ ) {
for(int j = 1; j < i ; j ++ ) {
if(arr[i]>arr[j]) {
dp[i] = max(dp[i],dp[j]+1);
}
}
}
int ans = 0;
for(int i = 1; i <= n; i ++ ) {
ans = max(ans,dp[i]);
}
printf("%d\n",ans);
} return 0;
}
//二分版本
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm> using namespace std;
const int maxn = 1005; int n,arr[maxn],dp[maxn],top,data; int main()
{
while(~scanf("%d",&n))
{
top = 1;
scanf("%d",&dp[0]);
for(int i =1 ; i < n ; i ++ ) {
scanf("%d",&data);
if(data > dp[top-1]) {
dp[top++] = data;
}
else {
dp[lower_bound(dp,dp+top,data)-dp] = data;
}
}
printf("%d\n",top);
} return 0;
}

最长公共上升子序列

HDU1423

Greatest Common Increasing Subsequence

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 8181 Accepted Submission(s): 2644

Problem Description

This is a problem from ZOJ 2432.To make it easyer,you just need output the length of the subsequence.

Input

Each sequence is described with M - its length (1 <= M <= 500) and M integer numbers Ai (-2^31 <= Ai < 2^31) - the sequence itself.

Output

output print L - the length of the greatest common increasing subsequence of both sequences.

Sample Input

1

5
1 4 2 5 -12
4
-12 1 2 4

Sample Output

2
#include <bits/stdc++.h>

using namespace std;
const int maxn = 1005; int f[maxn];
int a[maxn],n;
int b[maxn],m; int main()
{
int t;
while(~scanf("%d",&t))
{
while(t--)
{ memset(f,0,sizeof(f));
scanf("%d",&n);
for(int i = 1; i <= n; i ++ )
{
scanf("%d",&a[i]);
}
scanf("%d",&m);
for(int i = 1; i <= m; i ++ )
{
scanf("%d",&b[i]);
} for(int i = 1; i <= n; i ++ )
{
int MAX = 0;
for(int j = 1; j <= m; j ++ )
{
if(a[i] > b[j]) MAX = max(MAX,f[j]);
if(a[i] == b[j]) f[j] = MAX + 1;
}
} int ans = 0;
for(int j = 1; j <= m; j ++ )
{
ans = max(ans,f[j]);
}
printf("%d\n",ans);
if(t){
puts("");
}
}
} return 0;
}

跟着大佬重新入门DP的更多相关文章

  1. HDU 1231 最大连续子序列 --- 入门DP

    HDU 1231 题目大意以及解题思路见: HDU 1003题解,此题和HDU 1003只是记录的信息不同,处理完全相同. /* HDU 1231 最大连续子序列 --- 入门DP */ #inclu ...

  2. HDU 2571 命运 (入门dp)

    题目链接 题意:二维矩阵,左上角为起点,右下角为终点,如果当前格子是(x,y),下一步可以是(x+1,y),(x,y+1)或者(x,y*k) ,其中k>1.问最大路径和. 题解:入门dp,注意负 ...

  3. 【跟着大佬学JavaScript】之节流

    前言 js的典型的场景 监听页面的scroll事件 拖拽事件 监听鼠标的 mousemove 事件 ... 这些事件会频繁触发会影响性能,如果使用节流,降低频次,保留了用户体验,又提升了执行速度,节省 ...

  4. 【跟着大佬学JavaScript】之lodash防抖节流合并

    前言 前面已经对防抖和节流有了介绍,这篇主要看lodash是如何将防抖和节流合并成一个函数的. 初衷是深入lodash,学习它内部的好代码并应用,同时也加深节流防抖的理解.这里会先从防抖开始一步步往后 ...

  5. 【跟着大佬学JavaScript】之数组去重(结果对比)

    前言 数组去重在面试和工作中都是比较容易见到的问题. 这篇文章主要是来测试多个方法,对下面这个数组的去重结果进行分析讨论.如果有不对的地方,还请大家指出. const arr = [ 1, 1, &q ...

  6. 【笔记】入门DP

    复习一下近期练习的入门 \(DP\) .巨佬勿喷.\(qwq\) 重新写一遍练手,加深理解. 代码已经处理,虽然很明显,但请勿未理解就贺 \(qwq\) 0X00 P1057 [NOIP2008 普及 ...

  7. UVA 674 (入门DP, 14.07.09)

     Coin Change  Suppose there are 5 types of coins: 50-cent, 25-cent, 10-cent, 5-cent, and 1-cent. We ...

  8. 洛谷P3724 大佬 [AH2017/HNOI2017] dp+bfs

    正解:dp+bfs 解题报告: 传送门! 这题看起来很复杂的样子其实真的很复杂 但是仔细看一下题目,会发现其实操作只有两个目的嘛,一个是保证自己不死,一个是让对手减血 而且保证自己不死只有一种操作 而 ...

  9. 入门dp总结

    写这篇博文主要是为了归纳总结一下dp的有关问题(不定期更新,暑假应该会更的快一些) 会大概讲一下思路,不会事无巨细地讲 另一篇是平时做过的一些dp题,这篇博客里面提到的题都有题解放在那边:https: ...

随机推荐

  1. Python系列-python内置函数

    abs(x) 返回数字的绝对值,参数可以是整数.也可以是浮点数.如果是复数,则返回它的大小 all(iterable) 对参数中的所有元素进行迭代,如果所有的元素都是True,则返回True,函数等价 ...

  2. ZOJ-1586 QS Network---最小生成树Prim

    题目链接: https://vjudge.net/problem/ZOJ-1586 题目大意: 首先给一个t,代表t个测试样例,再给一个n,表示有n个QS装置,接下来一行是n个QS装置的成本.接下来是 ...

  3. 1024MySQL事物提交机制

    转自 http://www.cnblogs.com/exceptioneye/p/5451960.html MySQL作为一种关系型数据库,已被广泛应用到互联网中的诸多项目中.今天我们来讨论下事务的提 ...

  4. C++_进阶之函数模板_类模板

     C++_进阶之函数模板_类模板 第一部分 前言 c++提供了函数模板(function template.)所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体制定,用一个虚拟的类型来 ...

  5. chrome浏览器再次打开黑屏一段时间

    打开chrome设置 最下面-显示高级设置 再拉到最下面-使用硬件加速模式(把勾去掉)

  6. laravel Passport - 创建 REST API 用户认证以及Dingo/Api v2.0+Passport实现api认证

    第一部分: 安装passport 使⽤ Composer 依赖包管理器安装 Passport : composer require laravel/passport 接下来,将 Passport 的服 ...

  7. [LeetCode] Minimum Absolute Difference in BST 二叉搜索树的最小绝对差

    Given a binary search tree with non-negative values, find the minimum absolute difference between va ...

  8. [LeetCode] Find Largest Value in Each Tree Row 找树每行最大的结点值

    You need to find the largest value in each row of a binary tree. Example: Input: 1 / \ 3 2 / \ \ 5 3 ...

  9. Linux(七)开机,重启和用户登录注销

    7.1 关机&重启命令 基本介绍: shutdown -h now       立刻进行关机 shutdown -h 1            1分钟后关机 shutdown -r now  ...

  10. [LCA模版] Distance Queries

    题目描述 约翰的奶牛们拒绝跑他的马拉松,因为她们悠闲的生活不能承受他选择的长长的赛道.因此他决心找一条更合理的赛道.此题的输入于第一题相同,紧接着下一行输入一个整数K,以后K行为K个"距离问 ...