zoukankan      html  css  js  c++  java
  • hdoj_1231&&hdoj_1003最大连续子序列

    #include <iostream>
    #include <vector>
    #include <string>
    #include <fstream>
    #include <ctime>
    #include <cstdlib>
    using namespace std;
    
    int Start = 0;
    int End = 0;
    
    int maxSubSum(const vector<int>& a)
    {
    	int maxSum = -1, thisSum = 0;
    	int t = 0;
    	for (int j = 0; j < a.size(); j++)
    	{
    		thisSum += a[j];
    		if (thisSum > maxSum)
    		{
    			maxSum = thisSum;
    			Start = t;
    			End = j;
    		}
    		else if (thisSum < 0)
    		{
    			thisSum = 0;
    			t = j + 1;
    		}
    	}
    	return maxSum;
    }
    
    int main()
    {
    	freopen("in.txt","r",stdin);
    	int n, num;
    	vector<int>a;
    	bool flag;
    	while(scanf("%d",&n) !=EOF && n != 0)
    	{
    		flag = false;
    		for(int i = 0; i < n; i++)
    		{
    			scanf("%d", &num);
    			if(num >= 0) flag = true;
    			a.push_back(num);
    		}
    		if(flag)
    		{
    			int sum = maxSubSum(a);
    			cout << sum << " " << a[Start] << " " << a[End] << endl;
    		}
    		else
    		{
    			cout << 0 << " "<< a[0] << " " << a[a.size() - 1] << endl;
    		}
    		a.clear();
    	}
    	return 0;
    }
    

    求最大子序列和的算法见http://blog.csdn.net/lgh1992314/article/details/8257482


    1003

    #include <iostream>
    #include <string>
    #include <cstring>
    #include <cstdio>
    #include <cstdlib>
    using namespace std;
    int Start, End, n;
    int num[100005];
    
    int DP()
    {
    	int thissum = 0, maxsum = -999999;
    	int t = 0;
    	for(int i = 0; i < n; i++)
    	{
    		thissum += num[i];
    		if(thissum > maxsum)
    		{
    			maxsum = thissum;
    			Start = t;
    			End = i;
    		}
    		if(thissum < 0)
    		{
    			thissum = 0;
    			t = i + 1;
    		}
    	}
    	return maxsum;
    }
    
    int main()
    {
    	freopen("in.txt", "r", stdin);
    	int t;
    	scanf("%d", &t);
    	for(int i = 1; i <= t; i++)
    	{
    		memset(num, 0, sizeof(num));
    		scanf("%d", &n);
    		for(int j = 0; j < n; j++)
    		{
    			scanf("%d", &num[j]);
    		}
    		Start = 0;
    		End = 0;
    		int maxsum = DP(); 
    		printf("Case %d:\n", i);
    		printf("%d %d %d\n", maxsum, Start + 1, End + 1);
    		if(i != t) printf("\n");
    	}
    	return 0;
    }


  • 相关阅读:
    StringTable
    TCP网络协议
    也说JVM内存区域
    JVM类加载
    java中的引用:强、软、弱、虚
    AQS
    vscode支持unicode编码
    设计模式简记-快速改善代码质量的编程规范
    擅事利器
    设计模式简记-通过重构增强代码可测试性实战
  • 原文地址:https://www.cnblogs.com/lgh1992314/p/5835163.html
Copyright © 2011-2022 走看看