跟着大佬重新入门DP
数列两段的最大字段和
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;
}
最长公共上升子序列
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;
}
最长上升子序列
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;
}
最长公共上升子序列
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的更多相关文章
- HDU 1231 最大连续子序列 --- 入门DP
HDU 1231 题目大意以及解题思路见: HDU 1003题解,此题和HDU 1003只是记录的信息不同,处理完全相同. /* HDU 1231 最大连续子序列 --- 入门DP */ #inclu ...
- HDU 2571 命运 (入门dp)
题目链接 题意:二维矩阵,左上角为起点,右下角为终点,如果当前格子是(x,y),下一步可以是(x+1,y),(x,y+1)或者(x,y*k) ,其中k>1.问最大路径和. 题解:入门dp,注意负 ...
- 【跟着大佬学JavaScript】之节流
前言 js的典型的场景 监听页面的scroll事件 拖拽事件 监听鼠标的 mousemove 事件 ... 这些事件会频繁触发会影响性能,如果使用节流,降低频次,保留了用户体验,又提升了执行速度,节省 ...
- 【跟着大佬学JavaScript】之lodash防抖节流合并
前言 前面已经对防抖和节流有了介绍,这篇主要看lodash是如何将防抖和节流合并成一个函数的. 初衷是深入lodash,学习它内部的好代码并应用,同时也加深节流防抖的理解.这里会先从防抖开始一步步往后 ...
- 【跟着大佬学JavaScript】之数组去重(结果对比)
前言 数组去重在面试和工作中都是比较容易见到的问题. 这篇文章主要是来测试多个方法,对下面这个数组的去重结果进行分析讨论.如果有不对的地方,还请大家指出. const arr = [ 1, 1, &q ...
- 【笔记】入门DP
复习一下近期练习的入门 \(DP\) .巨佬勿喷.\(qwq\) 重新写一遍练手,加深理解. 代码已经处理,虽然很明显,但请勿未理解就贺 \(qwq\) 0X00 P1057 [NOIP2008 普及 ...
- 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 ...
- 洛谷P3724 大佬 [AH2017/HNOI2017] dp+bfs
正解:dp+bfs 解题报告: 传送门! 这题看起来很复杂的样子其实真的很复杂 但是仔细看一下题目,会发现其实操作只有两个目的嘛,一个是保证自己不死,一个是让对手减血 而且保证自己不死只有一种操作 而 ...
- 入门dp总结
写这篇博文主要是为了归纳总结一下dp的有关问题(不定期更新,暑假应该会更的快一些) 会大概讲一下思路,不会事无巨细地讲 另一篇是平时做过的一些dp题,这篇博客里面提到的题都有题解放在那边:https: ...
随机推荐
- 从零开始:一个正式的vue+webpack项目的目录结构是怎么形成的
如何从零开始一个vue+webpack前端工程工作流的搭建,首先我们先从项目的目录结构入手.一个持续可发展,不断加入新功能,方便后期维护的目录结构究竟是长什么样子的?接下来闰土大叔带你们一起手摸手学起 ...
- 二、配置QtDesigner、PyUIC及PyRcc
配置QtDesigner.PyUIC及PyRcc 安装完PyQt 5 及PyQt5-tools 后,则需要在Pycharm中配置QtDesigner.PyUIC及PyRcc. 配置QtDesigner ...
- Java面试题——中级(上)
List和Set比较,各自的子类比较 对比一:Arraylist与LinkedList的比较 1.ArrayList是实现了基于动态数组的数据结构,因为地址连续,一旦数据存储好了,查询操作效率会比较高 ...
- libevent中evmap实现(哈希表)
libevent中,需要将大量的监听事件event进行归类存放,比如一个文件描述符fd可能对应多个监听事件,对大量的事件event采用监听的所采用的数据结构是event_io_map,其实现通过哈希表 ...
- Mybatis JPA 插件简介(v2.1.0)
相比之前的版本(v1.1.0),此版本(v2.1.0)做了较大的改动. 项目地址: github https://github.com/cnsvili/mybatis-jpa gitee https: ...
- [LeetCode] Reorganize String 重构字符串
Given a string S, check if the letters can be rearranged so that two characters that are adjacent to ...
- [LeetCode] Shopping Offers 购物优惠
In LeetCode Store, there are some kinds of items to sell. Each item has a price. However, there are ...
- [LeetCode] Longest Word in Dictionary through Deleting 删除后得到的字典中的最长单词
Given a string and a string dictionary, find the longest string in the dictionary that can be formed ...
- [HNOI 2016]序列
Description 题库链接 给你一个长度为 \(n\) 的序列 \(A\) ,给出 \(q\) 组询问.每次询问 \([l,r]\) ,求该区间内所有的子序列中最小值的和. \(1\leq n, ...
- [NOIp 2011]Mayan游戏
Description Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个 7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.游戏 ...