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

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

PAT甲級1007

2019-11-10 23:24:51
字體:
來源:轉載
供稿:網友

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;}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 义马市| 林西县| 简阳市| 岱山县| 乌什县| 高平市| 玉溪市| 高陵县| 渭源县| 永清县| 兴文县| 邵阳市| 慈利县| 乌鲁木齐市| 高州市| 珠海市| 濮阳市| 临沭县| 通州区| 深圳市| 拉萨市| 唐山市| 衡山县| 会宁县| 咸阳市| 五华县| 邯郸县| 牙克石市| 清镇市| 镇安县| 大安市| 大田县| 隆化县| 宜川县| 玉龙| 清镇市| 吐鲁番市| 长治县| 梧州市| 永平县| 嵩明县|