国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

PAT甲級1007

2019-11-11 01:19:47
字體:
來源:轉載
供稿:網友

1007. Maximum Subsequence Sum (25)

時間限制400 ms內存限制65536 kB代碼長度限制16000 B判題程序Standard作者CHEN, Yue

Given a sequence of K integers { N1, N2, ..., NK }. A continuous subsequence is defined to be { Ni, Ni+1, ..., Nj } where 1 <= i <= j <= K. The Maximum Subsequence is the continuous subsequence which has the largest sum of its elements. For example, given sequence { -2, 11, -4, 13, -5, -2 }, its maximum subsequence is { 11, -4, 13 } with the largest sum being 20.

Now you are supposed to find the largest sum, together with the first and the last numbers of the maximum subsequence.

Input Specification:

Each input file contains one test case. Each case occupies two lines. The first line contains a positive integer K (<= 10000). The second line contains K numbers, separated by a space.

Output Specification:

For each test case, output in one line the largest sum, together with the first and the last numbers of the maximum subsequence. The numbers must be separated by one space, but there must be no extra space at the end of a line. In case that the maximum subsequence is not unique, output the one with the smallest indices i and j (as shown by the sample case). If all the K numbers are negative, then its maximum sum is defined to be 0, and you are supposed to output the first and the last numbers of the whole sequence.

Sample Input:
10-10 1 2 3 4 -5 -23 3 7 -21Sample Output:
10 1 4
#include<cstdio>#include<algorithm>using namespace std;const int maxn = 10010;int N[maxn];int d[maxn];int main(){	int K;	scanf("%d", &K);	for (int i = 0; i < K; i++)	{		scanf("%d", &N[i]);	}	d[0] = N[0];//邊界	for (int i = 1; i < K; i++)	{		d[i] = max(N[i], d[i - 1]+N[i]);//狀態轉移方程	}	int k=0;//由于是d[i]表示下標為i的數為尾的最大連續子序列的和,也就是說N[i]必須在其中	//那么d[K-1]不一定是最大的,需要對d[]進行遍歷找最大的,并記錄下標	for (int i = 0; i < K; i++)	{		if (d[i] > d[k])		{			k = i;		}	}	int sum = d[k];	int j = k;//j用來求最大子序列和的第一個數	if (sum != 0)//這個地方得注意下,若sum就等于0,j不需要自增	{		while (sum != 0)		{			sum -= N[j];			j--;		}		j++;	}	if (d[k] < 0)		PRintf("0 %d %d/n", N[0], N[K-1]);	else		printf("%d %d %d/n", d[k], N[j], N[k]);//注意題目說的是序列中的元素而不是下標	return 0;}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 皋兰县| 景宁| 马鞍山市| 连州市| 德格县| 黎平县| 水城县| 陆良县| 兴国县| 昌图县| 湛江市| 嫩江县| 达尔| 石嘴山市| 广昌县| 林西县| 古交市| 简阳市| 灵宝市| 晋州市| 平武县| 平原县| 新宾| 通化市| 长寿区| 来安县| 平罗县| 迁安市| 山西省| 江阴市| 巴中市| 湘阴县| 花垣县| 重庆市| 当雄县| 潍坊市| 富宁县| 屯门区| 华池县| 辛集市| 甘肃省|