pat a 1007 Maximum Subsequence Sum

本是做數據結構mooc的作業,出現很多問題,導致花了很長時間,值得反思。

 生詞:indices index的複數

這是我最後通過的代碼,用的在線處理算法:

#include<cstdio>
#include<vector>
using namespace std;
int first=0,last=0;
int MaxSubseqSum(vector<int> vi,int n){
	int nowSubSum=0,MaxSubSum=-1;//初始化爲-1,是爲了解決由0和負數組成的用例
	int a=0,b=0,temp=0,flag=0;
	for(int i=0;i<n;i++){
		nowSubSum+=vi[i];
		if(!flag&&vi[i]>=0)flag=1;
		if(nowSubSum>MaxSubSum){
//當MaxSubSum初值是0時,由0和負數組成的用例,將不會進入此處,b得不到更新。
MaxSubSum=nowSubSum;temp=a;b=i;}if(nowSubSum<0){nowSubSum=0;a=i+1;}} if(flag){first=vi[temp];last=vi[b];}if(flag==0)return 0;


//解決全是負數的用例
	return MaxSubSum; 
}
int main(){
	int n;
	scanf("%d",&n);
	vector<int> vi;
	int a=0;
	for(int i=0;i<n;i++){
		scanf("%d",&a);
		vi.push_back(a);
	}
	first=vi[0];
	last=vi[n-1];
	int sum=MaxSubseqSum(vi,n);	
	printf("%d %d %d",sum,first,last);
	return 0;
}

以下是標答:

思路簡單清晰,一邊輸入一邊處理,整體條理性強,模塊化強。感覺我寫的像毛線球一樣。

#include <cstdio>
#include <vector>
using namespace std;
int main() {
    int n, flag = 0, sum = -1, temp = 0, left = 0, right = 0, tempindex = 0;
    scanf("%d", &n);
    vector<int> v(n);
    for(int i = 0; i < n; i++) {
        scanf("%d", &v[i]);
        if(v[i] >= 0)
            flag = 1;
        temp = temp + v[i];
        if(temp > sum) {
            sum = temp;
            left = tempindex;
            right = i;
        } else if(temp < 0) {
            temp = 0;
            tempindex = i + 1;
        }
    }
    if(flag == 0)
        printf("0 %d %d", v[0], v[n - 1]);
    else
        printf("%d %d %d", sum, v[left], v[right]);
    return 0;
}

耽誤了健身,魚與熊掌不可得兼。

發佈了25 篇原創文章 · 獲贊 4 · 訪問量 8327
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章