bjfuoj 최장 연속 및 (동적 기획)

1997 단어
묘사
길이가 n인 시퀀스 A1, A2,...,An, 최대 연속화, 즉 i와 j를 찾아서 1<=i<=j<=n 및 Ai+...+Aj는 가능한 한 크다.
입력
입력한 첫 번째 동작은 데이터 그룹 수를 나타내는 정수 T(1<=T<=20)입니다.다음은 T조 테스트 데이터로 각 조의 데이터는 두 줄로 나뉘는데 첫 번째 줄은 하나의 정수 n(1<=n<=100000)이고 두 번째 행위는 n개의 정수이며 각 정수의 범위는 [-2^31,2^31-1]이다.
출력
각 그룹에 대해 입력한 데이터를 최대 연속 및 행으로 출력합니다.
샘플 입력 1
2
5
6 -1 5 4 -7
8
7 0 6 -1 1 -6 7 -5

샘플 출력 1
14
14
#include 
#include 
#include 
using namespace std;

long long max(long long a, long long b) { return (a > b)?a:b; }
long long min(long long a, long long b) { return (a < b)?a:b; }
int main()
{
	int a, b, c;
	while (cin >> a)
	{		
		for (int i = 0; i < a; i++)
		{
			cin >> b;
			long long sum = 0, minn = 0, maxn = 0;
			//      for     0,     
			cin >> c;
			sum = maxn = c;
			for (int j = 1; j < b; j++)
			{
				cin >> c;//      
				minn = min(minn, sum);//          
				sum += c;//    
				//                         
				maxn = max(maxn, sum - minn);
				//             ,       
			}
			cout << maxn << endl;
		}
	}
}
#include
#include
#include
#include
using namespace std;
long long A[100010], B[100010];
int main()
{
	int n;
	long long a, maxn;
	while (cin >> n) {
		for (int i = 0; i < n; i++)
		{
			cin >> a;
			cin >> A[0];
			B[0] = A[0];
			maxn = B[0];
			for (int i = 1; i < a; i++)
			{
				cin >> A[i];
				B[i] = max(B[i - 1] + A[i], A[i]);
				if (B[i] > maxn)maxn = B[i];
			}
			cout << maxn << endl;
		}
	}
	return 0;
}

요구 사항의 최대 연속과 존재 A 그룹에 B 그룹 저장 상태
상태 이동 방정식은
B[i] = max(B[i - 1] + A[i], A[i]);
예를 들어 첫 번째 입력:
a[i]    6     -1     5     4     -7
b[i]    6     5      10    14    7   
b[i]의 최대치 14는 최대 연속 및 입니다.

좋은 웹페이지 즐겨찾기