首页 > 代码库 > nefu 650 max num

nefu 650 max num

题目:经典dp题目,求出最大相邻子序列的和。

方法:给出两种方法,一种dp,一种直接暴力(数据量小的时候可以考虑)。

代码1:

#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
    int n;
    int t=1;
    cin>>n;
    int s[100010];
    while(t<=n)
    {
        int m;
        cin>>m;
        long long ans=0,sum=0;
        int l=1,r=1;
        int p=1,q=1;
        for(int i=1;i<=m;i++)
        {
            cin>>s[i];
            sum+=s[i];
            if(ans<sum)
            {
                ans=sum;
                p=l;q=r;
            }
            if(sum<0)
            {
                sum=0;
                l=i+1;
            }
            r++;
        }
        if(ans==0)        //考虑到全部为负数的情况,则从里面找到一个最大负数即可
        {
            ans=-10001;
            for(int i=1;i<=m;i++)
            if(ans<s[i])
            {
                ans=s[i];
                p=q=i;
            }
        }

        cout<<"Case "<<t++<<":"<<endl;
        cout<<ans<<" "<<p<<" "<<q<<endl<<endl;
    }
    return 0;
}

方法2:

#include<iostream>
#include<cstdio>
#include <algorithm>

using namespace std;


struct node
{
	int i1,j1;
	int sum,ns;
	
}a[10000];
bool cmp(node a,node b)
{
	if(a.sum!=b.sum) return a.sum>b.sum;
	else return a.ns<b.ns;
}

int main()
{
	int n,b[100000];
	while(scanf("%d",&n)!=EOF)
	{   int ans=1;
	    while(n--)
	    {
	    int m,i,j,k,q;
	    scanf("%d",&m);
	    for(i=0;i<m;i++)
	    scanf("%d",&b[i]);
	    
	    for(i=0,k=0;i<m;i++)
	    for(j=i;j<m;j++)
	    {    a[k].sum=0;a[k].ns=k;
	    	a[k].i1=i+1;a[k].j1=j+1;
	    	for(q=i;q<=j;q++)
	    	a[k].sum+=b[q];
	    	k++;
	    }
			
	    sort(a,a+k,cmp);
	    printf("Case %d:\n",ans++);
		printf("%d %d %d\n\n",a[0].sum,a[0].i1,a[0].j1);	   	
	    }			
	}	
	return 0;
}