1. 程式人生 > >mooc浙大資料結構PTA習題之最大子列和問題2(線上處理)

mooc浙大資料結構PTA習題之最大子列和問題2(線上處理)

01-複雜度2 Maximum Subsequence Sum(25 分)

Given a sequence of K integers { N​1​​, N​2​​, ..., NK​​ }. A continuous subsequence is defined to be { Ni​​, Ni+1​​, ..., Nj​​ } where 1≤ijK. 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 Knumbers, 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 -21

Sample Output:

10 1 4

參考程式碼:(以下程式碼沒拿滿分,在“並列和對應相同i但是不同j,即尾是0”測試中顯示錯誤。)

#include<iostream>  
using namespace std;  
int *getmaxsum(int a[], int n, int m[]){  
    int thissum=0, maxsum=0;//當我把對陣列m的初始化工作,即m[0]={0};放到被調函式中時會出現如圖所示的問題,編譯時沒問題,輸入數值執行計算後跳出該視窗。  
    int i,num=0;  
    int flag = 0;//用於處理只有負數和零的子列,此時應輸出0 0 0,用flag標記子列中是否出現了0。  
    thissum = 0; maxsum = 0;  
  
    for (i = 0; i < n; i++)  
    {  
        thissum += a[i];  
        if (a[i] == 0)  
        {  
            flag = 1;  
        }  
        if (thissum > maxsum)  
        {  
              
            maxsum = thissum;  
            m[2] = a[i];  
            num += 1;  
            if (num == 1)  
                m[1] = a[i];  
        }  
        else if (thissum < 0)  
        {  
            thissum = 0;  
            num = 0;  
        }  
    }  
    m[0] = maxsum;  
      
    if (maxsum == 0 && flag == 1)//處理只有負數和0的情況  
    {  
        m[0] = 0;  
        m[1] = 0;  
        m[2] = 0;  
    }  
    if (maxsum == 0 && flag == 0)//處理只有負數的情況  
    {  
        m[0]=0;m[1]=  a[0]; m[2] = a[n - 1];  
    }  
      
    return m;  
}  
int main()  
{  
    int k;  
    int m[3] = { 0};  
    cin >> k;  
    int *a = new int[k];  
    for (int i = 0; i < k; i++)  
        cin >> a[i];  
    int *b = getmaxsum(a, k,m);  
    for (int r = 0; r < 3; r++)  
    {  
        if (r == 2)  
            cout << b[2];  
        else  
            cout << b[r] << " ";  
    }  
  
    delete[]a;  
      
    return 0;  
}  

當我把對陣列m的初始化工作放到被調函式中時會出現如下問題:

以下是同方法的滿分程式碼,從mooc評論區複製並更改的,主要是更改了陣列a的定義方式,由固定長度a[100]改成了如下方式,通過了“最大N”的測試,但我實在看不到我的和這段程式碼的區別。

#include<iostream>  
  
int Maxseq(int a[], int K);  
using namespace std;  
  
int  main()  
{  
    int K;  
      
    int Max;  
    //cout<<"請輸入序列長度"<<endl;  
    cin >> K;  
    int *a = new int[K];  
    for (int i = 0; i<K; i++)  
        cin >> a[i];  
    Max = Maxseq(a, K);  
    delete[]a;  
    return 0;  
  
}  
int Maxseq(int a[], int K)  
{  
    int ThisSum = 0, MaxSum = 0;  
    int start = 0, end = 0;  
    int count = 0;  
    int flag = 0;  
    int first = 0, last = 0;  
    for (int i = 0; i<K; i++)  
    {  
  
        ThisSum += a[i];  
        if (a[i] == 0)  
            flag = 1;  
        ++count;  
        if (ThisSum>MaxSum)  
        {  
            MaxSum = ThisSum;  
            end = i;  
            start = end - count + 1;  
  
        }  
  
        else if (ThisSum<0)  
        {  
            ThisSum = 0;  
            count = 0;  
        }  
    }  
    first = a[start];  
    last = a[end];  
    if (MaxSum == 0 && flag == 1)  
    {  
        first = 0;  
        last = 0;  
    }  
    if (MaxSum == 0 && flag == 0)  
    {  
        first = a[0];  
        last = a[K - 1];  
    }  
    cout << MaxSum << " " << first << " " << last << endl;  
  
    return MaxSum;  
}  

更新:呃呃,附上對比滿分程式碼之後的修改版,改了之後也是滿分了,修改了記錄子列最左的記錄方式。我不知道什麼資料能使兩段程式碼輸出的結果會不一樣。

微笑

#include<iostream>  
using namespace std;
int *getmaxsum(int a[], int n, int m[]) {
	int thissum = 0, maxsum = 0;//當我把對陣列m的初始化工作,即m[0]={0};放到被調函式中時會出現如吐所示的問題,編譯時沒問題,輸入數值執行計算後跳出該視窗。  
	int i, num = 0;
	int flag = 0;//用於處理只有負數和零的子列,此時應輸出0 0 0,用flag標記子列中是否出現了0。  
	thissum = 0; maxsum = 0;

	for (i = 0; i < n; i++)
	{
		thissum += a[i];
		if (a[i] == 0)
		{
			flag = 1;
		}
		++num;
		if (thissum > maxsum)
		{

			maxsum = thissum;
			m[2] = a[i];
			
			
			m[1] = a[i - num + 1];
		}
		else if (thissum < 0)
		{
			thissum = 0;
			num = 0;
		}
	}
	m[0] = maxsum;

	if (maxsum == 0 && flag == 1)//處理只有負數和0的情況  
	{
		m[0] = 0;
		m[1] = 0;
		m[2] = 0;
	}
	if (maxsum == 0 && flag == 0)//處理只有負數的情況  
	{
		m[0] = 0; m[1] = a[0]; m[2] = a[n - 1];
	}

	return m;
}
int main()
{
	int k;
	int m[3] = { 0 };
	cin >> k;
	int *a = new int[k];
	for (int i = 0; i < k; i++)
		cin >> a[i];
	int *b = getmaxsum(a, k, m);
	for (int r = 0; r < 3; r++)
	{
		if (r == 2)
			cout << b[2];
		else
			cout << b[r] << " ";
	}

	delete[]a;

	return 0;
}

更新:

我知道了,錯誤不是尾是0的狀況,是開頭是0的狀況。

輸入0  1  2  3  5  0  -7

我的程式碼輸出11 1 5

滿分程式碼輸出11 0 5

按照題目要求,最大和相同時輸出i,j最小的那一組,應該輸出11 0 5。我的記錄方式使子列首項不會是0。

相關推薦

mooc浙大資料結構PTA習題大子問題2線上處理

01-複雜度2 Maximum Subsequence Sum(25 分) Given a sequence of K integers { N​1​​, N​2​​, ..., N​K​​ }. A continuous subsequence is defined to

中國大學MOOC-陳越、何欽銘-資料結構-2018秋 01-複雜度1 大子問題 20 分

01-複雜度1 最大子列和問題 (20 分) 給定K個整陣列成的序列{ N​1​​, N​2​​, ..., N​K​​ },“連續子列”被定義為{ N​i​​, N​i+1​​, ..., N​j​​ },其中 1≤i≤j≤K。“最大子列和”則被定義為所有連續子列元素的和

【中國大學MOOC-陳越、何欽銘-資料結構-2017秋】大子問題

給定K個整陣列成的序列{ N​1​​, N​2​​, ..., N​K​​ },“連續子列”被定義為{ N​i​​, N​i+1​​, ..., N​j​​ },其中 1≤i≤j≤K。“最大子列和”則被定義為所有連續子列元素的和中最大者。例如給定序列{ -2, 11, -4, 13, -5, -2

7-1 大子問題 20 分

給定K個整陣列成的序列{ N​1​​, N​2​​, …, N​K​​ },“連續子列”被定義為{ N​i​​, N​i+1​​, …, N​j​​ },其中 1≤i≤j≤K。“最大子列和”則被定義為所有連續子列元素的和中最大者。例如給定序列{ -2, 11,

01-複雜度1 大子問題20 分

題目描述: 給定K個整陣列成的序列{ N ​1 ​​ , N ​2 ​​ , …, N ​K ​​ },“連續子列”被定義為{ N ​i ​​ , N ​i+1 ​​ , …, N ​j ​​ },其中 1≤i≤j≤K。“最大子列和”則被定義為所有連續

PTA 資料結構題目1大子問題分而治線上處理演算法

題目來源: 問題描述: 問題分析: 對於一般的問題,原始解 都能通過一種 蠻力演算法,即窮舉法的思想得到。這題也不例外。 如果我們,把輸入的陣列,所有的子列都歷遍,並從中找出最大,即可得出我們的演算法。也就是版本一。 學習要點: 1、如何

資料結構大子

#include <stdlib.h> #include <stdio.h> int MaxSubseqSum(int a[],int N) {     int i,ThisSum = 0,MaxSum = 0;    &nb

資料結構程式碼實現佇列的連結串列實現C/C++

上班閒著無聊,一直想著要開始寫部落格,但又不知道寫什麼。最近又回顧了下資料結構的知識,那就從資料結構開始吧。 前言 關於C語言結構體的知識以及佇列的特性請讀者自行了解,此處不做過多解釋,嘻嘻。 同時此篇文章僅僅是關於佇列的連結串列實現。 第一步:結構體編寫 我們首先分析一下佇列的

大子問題浙江大學資料結構

//第三種,分治法  int Max(int A,int B,int C) {if(A>B&&A>C)return A;elseif(B>A&&B>C)return B;elsereturn C;  }  int PartSum(int A[],int

7-1 大子問題C語言版

7-1 最大子列和問題 (20 分) 給定K個整陣列成的序列{ N1, N2, …, NK },“連續子列”被定義為{ Ni, Ni+1, …, Nj },其中 1 <= i <= j <= K。“最大子列和”則被定義為所有連續子列元素的和中最

大子問題java描述

最大子段和問題: 1.問題描述:最大子段和問題就是:給定由n個整數(可能為負數)組成的序列a1,a2,a3......an,求該序列形如ai+ai+1+ai+2+...+aj的子段的最大和。當所有的整數均為負數時,定義其最大子段和為0,。例如,序列(a1,a2,a3,a4,a5,a6)=(-

大子陣列演算法Java實現

三種最大子陣列和演算法的Java實現和比較。(1)Java程式碼package com.sau.five.algorithmAnalysis; public class MaxSubsequenceSum { public static int maxSubseque

大子問題JAVA

最大子列和 問題描述:給定N個整數的序列{A1,A2,A3,……,An},求解子列和中最大的值。 這裡我們給出{-2,11,-4,13,-5,-2}這樣一個序列,正確的最大子列和為20 該題是在資料結構與演算法中經常用於分析時間複雜度的典型題目,以下將給出

大子(參考浙大-資料結構-MOOC)

參考中國大學Mooc (浙江大學)->資料結構 我把陳越姥姥講的最大子列和記錄一下,以備不時之需. "最大子列和" 問題 給一個數組,讓求出其中所有子列資料的和的Max 值. 1.暴力求解 拿到這個問題的第一瞬間想到的幾乎都是暴力,   遍歷所有的子序列,找到其

MOOC資料結構課程 題集01 大子問題

01-複雜度1 最大子列和問題 (20 分) 給定K個整陣列成的序列{ N​1​​, N​2​​, ..., N​K​​ },“連續子列”被定義為{ N​i​​, N​i+1​​, ..., N​j​​ },其中 1≤i≤j≤K。“最大子列和”則被定義為所有連續子列

PTA資料結構與演算法題目集中文5-1 大子問題 (20分)

給定KK個整陣列成的序列{ N_1N​1​​, N_2N​2​​, ..., N_KN​K​​ },“連續子列”被定義為{ N_iN​i​​, N_{i+1}N​i+1​​, ..., N_jN​j​​ },其中 1 \le i \le j \le K1≤i≤j≤

mooc浙大資料結構02-線性結構1 兩個有序連結串列序列的合併

題目:02-線性結構1 兩個有序連結串列序列的合併(15 分)本題要求實現一個函式,將兩個連結串列表示的遞增整數序列合併為一個非遞減的整數序列。函式介面定義:List Merge( List L1, List L2 ); 其中List結構定義如下:typedef struct

建立一個圖,並且遍歷---MOOC浙大資料結構

建圖 以鄰接表方式儲存的圖型別 typedef struct GNode *PtrToGNode; struct GNode{//整個圖 int Nv;//頂點數 int Ne;//邊數、

MOOC 資料結構 大子問題

原題:最大子列和 問題描述 “最大子列和”則被定義為所有連續子列元素的和中最大者。例如給定序列{ -2, 11, -4, 13, -5, -2 },其連續子列{ 11, -4, 13 }有最大的和20。現要求你編寫程式,計算給定整數序列的最大子列和。

MOOC浙大資料結構 — 06-圖1 列出連通集 (25分)

給定一個有NN個頂點和EE條邊的無向圖,請用DFS和BFS分別列出其所有的連通集。假設頂點從0到N-1N−1編號。進行搜尋時,假設我們總是從編號最小的頂點出發,按編號遞增的順序訪問鄰接點。 輸入格式: 輸入第1行給出2個整數NN(0<N\le 100<