poj 44 字串和【dp】

子串和

时间限制:5000 ms  |  内存限制:65535 KB

难度:3

描述
给定一整型数列{a1,a2...,an},找出连续非空子串{ax,ax+1,...,ay},使得该子序列的和最大,其中,1<=x<=y<=n。
输入
第一行是一个整数N(N<=10)表示测试数据的组数)
每组测试数据的第一行是一个整数n表示序列中共有n个整数,随后的一行里有n个整数I(-100=<I<=100),表示数列中的所有元素。(0<n<=1000000)
输出
对于每组测试数据输出和最大的连续子串的和。
样例输入
1
5
1 2 -1 3 -2
样例输出
5
提示
输入数据很多,推荐使用scanf进行输入
【思路】
      先确定状态,如果设F[n]表示前n个数中能选取出的最大连续子串和,则列出动态转移方程比较困难,列出方程的话复杂度也比较高。如果用F[n]表示,以第n个数为结尾的最大连续子串和则F[n]=max(F[n-1],0)+a[n]再求出F[n]数组中的最大值就即为所求的最大连续子串和。

实例分析:a[0]~a[10] ={ 0, -2, -3, 1, 2, 3, -2, 4};

第一次判断a[1] < 0; max_sum = -10000000;

a[2] < 0; max_sum = -10000000;

a[3] > 0; 所以 a[4] += a[3] = 3; max_sum = 3;

a[4] > 0; 所以 a[5] += a[4] = 6; max_sum = 6;

a[5] > 0; 所以 a[6] += a[5] = 4; max_sum = 6;

a[6] > 0; 所以 a[7] += a[6] = 10;max_sum = 10;

AC代码:
#include<cstdio>
#include<algorithm>
using namespace std;
int a[1000005];
int main()
{
	int N;
	scanf("%d", &N);
	while(N--)
	{
		int i, n, max_sum = -100000000;
		scanf("%d", &n);
		for(i = 1; i <= n; i++)
		{
			scanf("%d", &a[i]);
			if(a[i-1] > 0) a[i] += a[i-1];
			if(a[i] > max_sum) max_sum = a[i];
		}
		printf("%d\n", max_sum);
	}
	return 0;
}
时间: 2024-10-14 07:33:14

poj 44 字串和【dp】的相关文章

NYOJ 44 字串和

子串和 时间限制:5000 ms  |  内存限制:65535 KB 难度:3 描述 给定一整型数列{a1,a2...,an},找出连续非空子串{ax,ax+1,...,ay},使得该子序列的和最大,其中,1<=x<=y<=n. 输入 第一行是一个整数N(N<=10)表示测试数据的组数) 每组测试数据的第一行是一个整数n表示序列中共有n个整数,随后的一行里有n个整数I(-100=<I<=100),表示数列中的所有元素.(0<n<=1000000) 输出 对于

【Foreign】字串变化 [DP]

字串变化 Time Limit: 10 Sec  Memory Limit: 128 MB Description 定义一个(大写字母)字符串集合{S},初始时值包含一个给定的字符串S1,每次从中任意取出一个字符串,将它变换后再放入集合中.要求新的字符串在集合中没有出现过. 变换的规则:在变化前.后,字符串均有大写字母组成,每次只改动一个位置,使它的ASCLL加1.例如:‘A’ –> ‘B’.如果位置为‘Z’,则无法改动.若干次操作后,该集合的元素个数一定会达到最大. 对最后的集合(已按字典序排

NYOJ 44 字串和 (最大字串和 线性dp)

题目链接: http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=44 子串和 时间限制:5000 ms  |  内存限制:65535 KB 难度:3 描述 给定一整型数列{a1,a2...,an},找出连续非空子串{ax,ax+1,...,ay},使得该子序列的和最大,其中,1<=x<=y<=n. 输入 第一行是一个整数N(N<=10)表示测试数据的组数) 每组测试数据的第一行是一个整数n表示序列中共有n个整数,随后的一行里有n个

POJ - 2406 ~SPOJ - REPEATS~POJ - 3693 后缀数组求解重复字串问题

POJ - 2406 题意: 给出一个字符串,要把它写成(x)n的形式,问n的最大值. 这题是求整个串的重复次数,不是重复最多次数的字串 这题很容易想到用KMP求最小循环节就没了,但是后缀数组也能写 后缀数组写法放在后面那一题,SPOJ - REPEATS是求子串类型,KMP就不好处理了 这里放下处理KMP的AC代码: 1 #include <cstdio> 2 #include <cstring> 3 #include <queue> 4 #include <c

POJ 3356 AGTC 最短编辑距离 DP

http://poj.org/problem?id=3356 题意: 给两个长度不大于1000的串,修改其中一个串使得两串相同,问最少修改次数.修改有三种,插入一个字符,删除一个字符,改变一个字符. 分析: 直接给方程. dp[i][j]表示第一个串前i位和第二串前j位匹配的最小修改次数. dp[0][0] = 0, dp[length(x)][length(y)]为答案. dp[i][j] = min(dp[i-1][j-1] + x[i] != y[j], dp[i-1][j] + 1, d

洛谷OJ P1032 字串变换 解题报告

洛谷OJ P1032 字串变换 解题报告 by MedalPluS   [题目描述] 已知有两个字串 A$, B$ 及一组字串变换的规则(至多6个规则): A1$ -> B1$ A2$ -> B2$ 规则的含义为:在 A$中的子串 A1$ 可以变换为 B1$.A2$ 可以变换为 B2$ …. 例如:A$='abcd' B$='xyz' 变换规则为: ‘abc’->‘xu’ ‘ud’->‘y’ ‘y’->‘yz’ 则此时,A$ 可以经过一系列的变换变为 B$,其变换的过程为:

NOIP2002 字串变换题解(双向搜索)

65. [NOIP2002] 字串变换 时间限制:1 s   内存限制:128 MB [问题描述] 已知有两个字串A$, B$及一组字串变换的规则(至多6个规则): A1$ -> B1$ A2$ -> B2$ 规则的含义为:在A$中的子串A1$可以变换为B1$.A2$可以变换为B2$-. 例如:A$='abcd'  B$='xyz' 变换规则为:'abc'->'xu' 'ud'->'y' 'y'->'yz' 则此时,A$可以经过一系列的变换变为B$,其变换的过程为: 'abc

【经典算法】寻找最长01字串(转自待字闺中)

这两天在微信公众号“待字闺中”中看到一个经典的面试算法,寻找最长01字串,原题目是这么说的: 给定一个数组,数组中只包含0和1.请找到一个最长的子序列,其中0和1的数量是相同的. 例1:10101010 结果就是其本身.例2:1101000 结果是110100 这个题目,看起来比较简单,一些同学可能认为题目的描述符合动态规划的特征,然后就开始用动态规划解,努力找状态转移方程.这些同学的感觉,是很正确的.但,找状态转移方程,我们要对原来的数组进行变换一下. 原来是0和1的串,我们将0都换为-1.这

[NOIP2002] 提高组P1032 字串变换

题目描述 已知有两个字串 A, B 及一组字串变换的规则(至多6个规则): A1 -> B1 A2 -> B2 规则的含义为:在 A$中的子串 A1 可以变换为 B1.A2 可以变换为 B2 …. 例如:A='abcd'B='xyz' 变换规则为: ‘abc’->‘xu’‘ud’->‘y’‘y’->‘yz’ 则此时,A 可以经过一系列的变换变为 B,其变换的过程为: ‘abcd’->‘xud’->‘xy’->‘xyz’ 共进行了三次变换,使得 A 变换为B.