跟着大佬重新入门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: ...
随机推荐
- VMware虚拟机安装
学习Linux系统最好的方式就是在自己的虚拟机上安装Linux:接下来就给大家简单介绍一下VMware虚拟机的安装以及Linux的安装:VMware虚拟机只是为了更好的学习Linux: ...
- golang-在gin中cookie跨域设置(配合ajax)
1.当我在golang中,在前后端分离的情况下使用cookies时发现,跨域没有被允许.代码如下: func AccessJsMiddleware() gin.HandlerFunc { return ...
- jquery checkbox radio 标签 选中的3种方法
张映 发表于 2013-07-16 分类目录: js/jquery 标签:checkbox, jquery, radio, 选中 jquery 很灵活,checkbox radio标签选中的方法有很多 ...
- eclipse下maven插件搭建springmvc之helloworld
这几天学习了怎样使用maven,最终还是要回归web项目嘛,所以主要还是使用eclipse插件. 1 下载eclipse maven插件. 其实新版的eclipse已经集成了maven:lunar.m ...
- Linux(一)VMware虚拟机的安装
vmware的安装文件: 链接:https://pan.baidu.com/s/1QGjNqRZzE-vV7Af0PI2QYA 密码:omfe 1.1 首先下载安装包 安装包的内容 1.2 双击exe ...
- iOS masonry 不规则tagView布局 并自适应高度
在搜索页面经常会有不规则的tag出现,这种tagView要有点击事件,单个tagView可以设置文字颜色,宽度不固定根据内容自适应,高度固定,数量不固定.总高度就不固定.最近对于masonry的使用又 ...
- Java多线程之interrupt()的深度研究
近期学习Java多线程的中断机制,网上的帖子说得很浅,并没深究其原理.看了Java源码,对Java的中断机制有了略深入的理解,在这篇文章中向感兴趣的网友分享下.这篇文章主要通过一个典型例子对中断机制进 ...
- 0316-关于js 注意事项
js:脚本语言,控制网页的行为(特效,表单验证) /* 这是多行注释 *///这是单行注释 js问题及注意事项: JavaScript 对大小写是敏感的 多写注释.提示性文字要说明白 定义变量时最好加 ...
- [LeetCode] Partition to K Equal Sum Subsets 分割K个等和的子集
Given an array of integers nums and a positive integer k, find whether it's possible to divide this ...
- spark-shell报错:Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/fs/FSDataInputStream
环境: openSUSE42.2 hadoop2.6.0-cdh5.10.0 spark1.6.0-cdh5.10.0 按照网上的spark安装教程安装完之后,启动spark-shell,出现如下报错 ...