NYOJ 题目442字串和之差(动态规划)

字串和之差

时间限制: 3000 ms  |  内存限制: 65535 KB
难度: 4
描述
给出一个数列{a 1,a 2,a 3,a 4……a n},选出一个连续非空子序列,使该序列的绝对值max最大,再选出一个非空子序列(与第一个序列的选择无关),使该序列的绝对值min最小。输出max与min的差值。
输入
第一行是一个整数m(m<15)表示测试数据的组数。
每组数据第一行是一个整数 n(n<1000000),表示这个数列元素的个数,接下来一行是n个整数x(-100<x<100)。
输出
输出max与min的差值(max-min).每组数据输出占一行。
样例输入
2
4
-1 1 3 2
5
2 3 -2 4 1
样例输出
6
7
来源
原创
上传者
ACM_杨延玺
思路:这个题是让找的子序列,一是连续,二是绝对值,dp[i]表示的从第一项到第i项的和,这用到的一个技巧,就是加入了一个元素0
这样全部是负的时候 0 - dp[0]就是最大值,全部是正的dp[n - 1] - 0也是最大值,有正有负dp[n - 1] - dp[0]就是最大值,求最小值时,排序完相邻的俩个的dp值的差应该是最近了,遍历一下找到最小的就好
ac代码
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define INF 0xfffffff
int dp[1000010];
int cmp(const void *a,const void *b)
{
	return *(int *)a-*(int *)b;
}
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		int i,num,max,min,n;
		dp[0]=0;
		scanf("%d",&n);
		for(i=1;i<=n;i++)
		{
			scanf("%d",&num);
			dp[i]=dp[i-1]+num;
		}
		qsort(dp,n+1,sizeof(dp[0]),cmp);
		max=dp[n]-dp[0];
		min=INF;
		for(i=0;i<n;i++)
		{
			if(min>dp[i+1]-dp[i])
				min=dp[i+1]-dp[i];
		}
		printf("%d\n",max-min);
	}
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值